【问题标题】:SQL DENSE_RANK and PARTITION BYSQL DENSE_RANK 和 PARTITION BY
【发布时间】:2019-11-14 12:25:13
【问题描述】:

我不完全理解下面列出的查询结果:

CREATE TABLE #tmpAccountsTable (ID INT PRIMARY KEY, AccountID INT, 

AccountName varchar(20), CompanyID int, CompanyName varchar(50))
INSERT INTO #tmpAccountsTable (ID, AccountID, AccountName, CompanyID, CompanyName)
SELECT 1 AS ID, 1 AS AccountID, 'ABC Account' AS AccountName, 1 AS CompanyID, 'Stark Enterprise' AS CompanyName UNION
SELECT 2 AS ID, 1 AS AccountID, 'ABC Account' AS AccountName, 1 AS CompanyID, 'Stark Enterprise' AS CompanyName UNION
SELECT 3 AS ID, 2 AS AccountID, 'DEF Account' AS AccountName, 1 AS CompanyID, 'Stark Enterprise' AS CompanyName UNION
SELECT 4 AS ID, 3 AS AccountID, 'GHI Account' AS AccountName, 1 AS CompanyID, 'Stark Enterprise' AS CompanyName UNION
SELECT 5 AS ID, 4 AS AccountID, 'JKL Account' AS AccountName, 1 AS CompanyID, 'Stark Enterprise' AS CompanyName UNION
SELECT 6 AS ID, 1 AS AccountID, 'ABC Account' AS AccountName, 1 AS CompanyID, 'Stark Enterprise' AS CompanyName UNION
SELECT 7 AS ID, 1 AS AccountID, 'ABC Account' AS AccountName, 1 AS CompanyID, 'Stark Enterprise' AS CompanyName UNION
SELECT 8 AS ID, 1 AS AccountID, 'ABC Account' AS AccountName, 1 AS CompanyID, 'Stark Enterprise' AS CompanyName UNION
SELECT 9 AS ID, 2 AS AccountID, 'DEF Account' AS AccountName, 1 AS CompanyID, 'Stark Enterprise' AS CompanyName

SELECT DENSE_RANK() OVER (PARTITION BY AccountID ORDER BY CompanyName) as AccountRANK, * FROM #tmpAccountsTable

DROP TABLE #tmpAccountsTable

执行上述,我得到以下结果集:

根据我对SELECT DENSE_RANK() OVER (PARTITION BY AccountID ORDER BY CompanyName) as AccountRANK, * FROM #tmpAccountsTable 的理解,应该为所有相同的AccountId 创建一个分区,并且它们应该收到相同的DENSE_RANK() 值,但可以看出,情况并非如此。

我错过了什么?

【问题讨论】:

  • AccountID 1 的所有排名都是并列的,因此它们都是 1,AccountID 2、3 和 4 的排名相同。您期望它是什么?

标签: sql sql-server partition over-clause


【解决方案1】:

如果您希望每个 AccountId 有一个单独的值,那么它应该是 ORDER BY 的一部分,而不是 PARTITION BY

SELECT DENSE_RANK() OVER (ORDER BY AccountID, CompanyName) as AccountRANK, *
FROM #tmpAccountsTable;

PARTITION BY 用于重置计数器,因此每个AccountId从 1 开始。然后将CompanyNames 排序。因为它们都有相同的值,所以结果是1

【讨论】:

  • “PARTITION BY 用于重置计数器”。你到底什么意思?我的印象是 PARTITION BY AccountID 将为所有具有相同值的 AccountID 创建一个分区,因此具有相同的排名值?
  • @monstertjie_za 。 . .我认为这很清楚。我的意思是每个AccountId 都会从1 开始对该帐户的CompanyName 值进行排名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2021-10-29
  • 2021-03-09
  • 1970-01-01
相关资源
最近更新 更多