查询显示最高分,包括并列,并带有内连接

问题描述 投票:0回答:1

我有一个查询显示上周的“高分”。接下来我需要修改它以给出前 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
sql sql-server
1个回答
0
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.