下面是用于SQL Server 2012+,2005年至2008 R2独立的解决方案,以及2000:
2012+
CREATE TABLE #PlayerPoints
(ID INT PRIMARY KEY
, Name VARCHAR(10) NOT NULL
, Email VARCHAR(20) NOT NULL
, Points INT NOT NULL);
INSERT INTO #PlayerPoints (ID, Name, Email, Points)
VALUES
(1, 'John', '[email protected]', 120)
, (2, 'Test', '[email protected]', 100)
, (3, 'John', '[email protected]', 80)
, (4, 'Bob', '[email protected]', 50)
, (5, 'John', '[email protected]', 80)
WITH BaseData
AS
(SELECT ID
, Email
, Points
, LastRecordName = LAST_VALUE(Name) OVER
(PARTITION BY Email
ORDER BY ID DESC
ROWS UNBOUNDED PRECEDING)
FROM #PlayerPoints)
SELECT Email
, LastRecordName = MAX(LastRecordName)
, Points = SUM(Points)
, Games_Played = COUNT(*)
, Average_Points = AVG(Points)
FROM BaseData
GROUP BY Email
ORDER BY Points DESC;
2005年至2008 R2
CREATE TABLE #PlayerPoints
(ID INT PRIMARY KEY
, Name VARCHAR(10) NOT NULL
, Email VARCHAR(20) NOT NULL
, Points INT NOT NULL);
INSERT INTO #PlayerPoints (ID, Name, Email, Points)
VALUES
(1, 'John', '[email protected]', 120)
, (2, 'Test', '[email protected]', 100)
, (3, 'John', '[email protected]', 80)
, (4, 'Bob', '[email protected]', 50)
, (5, 'John', '[email protected]', 80)
WITH BaseData
AS
(SELECT ID
, Email
, Name
, ReverseOrder = ROW_NUMBER() OVER
(PARTITION BY Email
ORDER BY ID DESC)
FROM #PlayerPoints)
SELECT pp.Email
, LastRecordName = MAX(bd.Name)
, Points = SUM(pp.Points)
, Games_Played = COUNT(*)
, Average_Points = AVG(pp.Points)
FROM #PlayerPoints pp
JOIN BaseData bd
ON pp.Email = bd.Email
AND bd.ReverseOrder = 1
GROUP BY pp.Email
ORDER BY Points DESC;
CREATE TABLE #PlayerPoints
(ID INT PRIMARY KEY
, Name VARCHAR(10) NOT NULL
, Email VARCHAR(20) NOT NULL
, Points INT NOT NULL);
INSERT INTO #PlayerPoints (ID, Name, Email, Points)
SELECT 1, 'John', '[email protected]', 120
UNION ALL
SELECT 2, 'Test', '[email protected]', 100
UNION ALL
SELECT 3, 'John', '[email protected]', 80
UNION ALL
SELECT 4, 'Bob', '[email protected]', 50
UNION ALL
SELECT 5, 'John', '[email protected]', 80;
SELECT pp.Email
, LastRecordName = MAX(sppmi.Name)
, Points = SUM(pp.Points)
, Games_Played = COUNT(*)
, Average_Points = AVG(pp.Points)
FROM #PlayerPoints pp
JOIN
(SELECT spp.Email
, spp.Name
FROM #PlayerPoints spp
JOIN
(SELECT Email
, MaximumID = MAX(ID)
FROM #PlayerPoints
GROUP BY Email) mi
ON spp.ID = mi.MaximumID) sppmi
ON pp.Email = sppmi.Email
GROUP BY pp.Email
ORDER BY Points DESC;
绝妙的回答。谢谢.....解决了我的问题,并学习了一些新的东西。不应该是Max(姓名)? Min(姓名)的含义是什么? –
我会使用电子邮件清楚地忽略名称,这取决于您使用MININimum或MAXimum名称,它在任何情况下都是随机的。 – bummi
以及我只是想知道什么是Max或Min的名称作为它不是一个数字的功能,它是否像字典顺序工作? –