提问人:SkyeBoniwell 提问时间:10/20/2023 最后编辑:marc_sSkyeBoniwell 更新时间:10/20/2023 访问量:59
如何使用 ROW_NUMBER() 仅计算非重复值?[复制]
How can I use ROW_NUMBER() to count only distinct values? [duplicate]
问:
我有这个SQL查询:
SELECT
sg.rolesID,
count# = ROW_NUMBER() OVER (ORDER BY sg.rolesContainerID),
sg.rolesContainerID,
eventTimeStamp AS timeStarted,
eventTimeStamp AS timeFinished
FROM
view_SecurityGroup sg
WHERE
sg.rolesID = '22400ab8-62a2-4a69-b002-5dd4d0459728'
ORDER BY
sg.rolesContainerID, timeStarted, timeFinished DESC
有了这些结果:
rolesID count# rolesContainerID timeStarted timeFinished
----------------------------------------------------------------------------------------------------------------------------------------------------
22400AB8-62A2-4A69-B002-5DD4D0459728 1 153F36C8-6FB5-4B50-A2D7-000209C96663 2023-02-27 14:26:50.583 2023-02-27 14:26:50.583
22400AB8-62A2-4A69-B002-5DD4D0459728 2 153F36C8-6FB5-4B50-A2D7-000209C96663 2023-02-27 14:26:50.587 2023-02-27 14:26:50.587
22400AB8-62A2-4A69-B002-5DD4D0459728 3 153F36C8-6FB5-4B50-A2D7-000209C96663 2023-02-27 14:26:58.420 2023-02-27 14:26:58.420
22400AB8-62A2-4A69-B002-5DD4D0459728 4 790E699D-1BDE-4CCA-B6A6-013696B81774 2023-02-28 15:41:02.540 2023-02-28 15:41:02.540
22400AB8-62A2-4A69-B002-5DD4D0459728 5 790E699D-1BDE-4CCA-B6A6-013696B81774 2023-02-28 15:42:51.540 2023-02-28 15:42:51.540
22400AB8-62A2-4A69-B002-5DD4D0459728 6 790E699D-1BDE-4CCA-B6A6-013696B81774 2023-02-28 15:44:27.560 2023-02-28 15:44:27.560
22400AB8-62A2-4A69-B002-5DD4D0459728 7 223C4704-2B04-404D-991A-04B408C6CA93 2022-11-04 13:59:03.343 2022-11-04 13:59:03.343
22400AB8-62A2-4A69-B002-5DD4D0459728 8 223C4704-2B04-404D-991A-04B408C6CA93 2022-11-04 13:59:03.347 2022-11-04 13:59:03.347
22400AB8-62A2-4A69-B002-5DD4D0459728 9 223C4704-2B04-404D-991A-04B408C6CA93 2022-11-04 14:05:49.133 2022-11-04 14:05:49.133
22400AB8-62A2-4A69-B002-5DD4D0459728 10 229105A8-2713-44FE-B0D0-0FF09F54E905 2023-02-27 00:28:58.840 2023-02-27 00:28:58.840
22400AB8-62A2-4A69-B002-5DD4D0459728 11 229105A8-2713-44FE-B0D0-0FF09F54E905 2023-02-27 00:29:48.513 2023-02-27 00:29:48.513
但是我希望只为每个角色ContainerID递增...喜欢这个:count#
rolesID count# rolesContainerID timeStarted timeFinished
----------------------------------------------------------------------------------------------------------------------------------------------------
22400AB8-62A2-4A69-B002-5DD4D0459728 1 153F36C8-6FB5-4B50-A2D7-000209C96663 2023-02-27 14:26:50.583 2023-02-27 14:26:50.583
22400AB8-62A2-4A69-B002-5DD4D0459728 1 153F36C8-6FB5-4B50-A2D7-000209C96663 2023-02-27 14:26:50.587 2023-02-27 14:26:50.587
22400AB8-62A2-4A69-B002-5DD4D0459728 1 153F36C8-6FB5-4B50-A2D7-000209C96663 2023-02-27 14:26:58.420 2023-02-27 14:26:58.420
22400AB8-62A2-4A69-B002-5DD4D0459728 2 790E699D-1BDE-4CCA-B6A6-013696B81774 2023-02-28 15:41:02.540 2023-02-28 15:41:02.540
22400AB8-62A2-4A69-B002-5DD4D0459728 2 790E699D-1BDE-4CCA-B6A6-013696B81774 2023-02-28 15:42:51.540 2023-02-28 15:42:51.540
22400AB8-62A2-4A69-B002-5DD4D0459728 2 790E699D-1BDE-4CCA-B6A6-013696B81774 2023-02-28 15:44:27.560 2023-02-28 15:44:27.560
22400AB8-62A2-4A69-B002-5DD4D0459728 3 223C4704-2B04-404D-991A-04B408C6CA93 2022-11-04 13:59:03.343 2022-11-04 13:59:03.343
22400AB8-62A2-4A69-B002-5DD4D0459728 3 223C4704-2B04-404D-991A-04B408C6CA93 2022-11-04 13:59:03.347 2022-11-04 13:59:03.347
22400AB8-62A2-4A69-B002-5DD4D0459728 3 223C4704-2B04-404D-991A-04B408C6CA93 2022-11-04 14:05:49.133 2022-11-04 14:05:49.133
22400AB8-62A2-4A69-B002-5DD4D0459728 4 229105A8-2713-44FE-B0D0-0FF09F54E905 2023-02-27 00:28:58.840 2023-02-27 00:28:58.840
22400AB8-62A2-4A69-B002-5DD4D0459728 4 229105A8-2713-44FE-B0D0-0FF09F54E905 2023-02-27 00:29:48.513 2023-02-27 00:29:48.513
有没有办法在SQL Server中做到这一点?
谢谢!
答:
2赞
Hogan
10/20/2023
#1
count# = DENSE_RANK() OVER (ORDER BY sg.rolesContainerID),
或
DENSE_RANK() OVER (ORDER BY sg.rolesContainerID) AS count#,
1赞
DerDot
10/20/2023
#2
霍根的答案是正确的,这将是完美的。
我只是觉得看到从这个文档页面中提取的这个查询可能会很有趣。
SELECT p.FirstName, p.LastName
,ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number"
,RANK() OVER (ORDER BY a.PostalCode) AS Rank
,DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank"
,NTILE(4) OVER (ORDER BY a.PostalCode) AS Quartile
,s.SalesYTD
,a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;
名字 | 姓氏 | 行号 | 排 | 密集等级 | 四分位数 | 销售YTD | 邮政编码 |
---|---|---|---|---|---|---|---|
迈克尔 | 布莱斯 | 1 | 1 | 1 | 1 | 3763178.1787 | 98027 |
琳 达 | 米切尔 | 2 | 1 | 1 | 1 | 4251368.5497 | 98027 |
朱里安 | 卡森 | 3 | 1 | 1 | 1 | 3189418.3662 | 98027 |
加勒特 | 瓦格斯 | 4 | 1 | 1 | 1 | 1453719.4653 | 98027 |
茨维 | 雷特 | 5 | 1 | 1 | 2 | 2315185.6110 | 98027 |
帕梅拉 | 安斯曼-沃尔夫 | 6 | 1 | 1 | 2 | 1352577.1325 | 98027 |
树 | 伊藤美诚 | 7 | 7 | 2 | 2 | 2458535.6169 | 98,5 千米赛 |
何塞 | 萨拉伊瓦 | 8 | 7 | 2 | 2 | 2604540.7172 | 98,5 千米赛 |
大卫 | 坎贝尔 | 9 | 7 | 2 | 3 | 1573012.9383 | 98,5 千米赛 |
太特 | 门萨-安南 | 10 | 7 | 2 | 3 | 1576562.1966 | 98,5 千米赛 |
林恩 | 索菲利亚斯 | 11 | 7 | 2 | 3 | 1421810.9242 | 98,5 千米赛 |
瑞 秋 | 巴尔德斯 | 12 | 7 | 2 | 4 | 1827066.7118 | 98,5 千米赛 |
载 | 北 | 13 | 7 | 2 | 4 | 4116871.2277 | 98,5 千米赛 |
兰吉特 | 瓦尔基·丘杜卡蒂尔 | 14 | 7 | 2 | 4 | 3121616.3202 | 98,5 千米赛 |
在示例中,它们显示了不同的排名窗口函数如何在同一查询中使用所有这些函数,因此您可以清楚地看到并理解它们之间的区别。
评论
DENSE_RANK