我有一个查询显示上周的“高分”。接下来我需要修改它以给出前 3 个高分,但包括平局,例如:
{2FC28DA7-6CD3-4DC0-8465-98534B8F75AD} Bob 250
{2CF80760-B372-4C3D-8BFD-DBAEF4397442} Bill 123
{77F0C9D1-414B-4ABB-8FC0-D1E88969EA6A} Ben 123
{35F0C921-4443-4A30-8AC1-E3288969E4B3} Baz 101
这是我到目前为止所掌握的,我真的不知道从哪里开始成为 SQL 初学者:
SELECT TOP (3) tblAccounts.accountID, tblAccounts.contactName, SUM(MONMWins.Points) As ttlPoints
FROM MONMWins
INNER JOIN tblAccounts
ON MONMWins.accountID = tblAccounts.accountID
WHERE MONMWins.dateAdded > DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 6)
GROUP BY tblAccounts.accountID, tblAccounts.contactName
ORDER BY ttlPoints DESC, tblAccounts.contactName
TOP(3)
查看前三行。即使您这样做了TOP(3) WITH TIES
,DBMS 也会查看前三行,并且仅当它们的点数总和与第三行相同时才包含更多行。
您想要做的是查看点并相应地对行进行排名。这是通过
DENSE_RANK
完成的。
WITH
ranked AS
(
SELECT
a.accountid,
a.contactname,
SUM(w.points) As ttlpoints,
DENSE_RANK() OVER (ORDER BY SUM(w.points) DESC) AS rnk
FROM monmwins w
INNER JOIN tblaccounts a ON a.accountid = w.accountid
WHERE w.dateadded > DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 6)
GROUP BY a.accountid, a.contactname
)
SELECT accountid, contactname, ttlpoints
FROM ranked
WHERE rnk <= 3
ORDER BY ttlpoints DESC, contactname;