如何在此查询中使用 ROW_NUMBER?
How can use ROW_NUMBER in this query?
我是 SQL 服务器的新手,有一个这样的查询:
SELECT distinct top 10 ExecuteDate
FROM [ClubEatc].[dbo].[GetOnlineBills]
ORDER BY ExecuteDate DESC
我应该在该查询中使用 Row_Number
,我该如何编写该查询?
谢谢大家。
如果您希望每一行都有一个数字并且 ExecuteDate 应该不同:
WITH CTE AS
(
SELECT DISTINCT ExecuteDate FROM [ClubEatc].[dbo].[GetOnlineBills]
)
SELECT TOP 10 ExecuteDate, RN = ROW_NUMBER() OVER (ORDER BY ExecuteDate DESC)
FROM CTE
ORDER BY ExecuteDate DESC
或 GROUP BY
:
SELECT TOP 10 ExecuteDate, RN = ROW_NUMBER() OVER (ORDER BY ExecuteDate DESC)
FROM [ClubEatc].[dbo].[GetOnlineBills]
GROUP BY ExecuteDate
ORDER BY ExecuteDate DESC
也许您想查看整个记录,但只是每个 ExecuteDate-Group 的第一个。那么这个查询将起作用:
WITH CTE AS
(
SELECT ExecuteDate,
RN_DESC = ROW_NUMBER() OVER (PARTITION BY ExecuteDate
ORDER BY ExecuteDate DESC)
FROM [ClubEatc].[dbo].[GetOnlineBills]
)
SELECT TOP 10 ExecuteDate
FROM CTE
WHERE RN_DESC = 1
ORDER BY ExecuteDate DESC
您可以列出所有列,而不仅仅是 ExecuteDate
列。但是 ExecuteDate
是分组依据的列,您没有告诉我们您要使用哪一列来对每个组进行排序,因此您没有告诉我们您希望看到每个 ExecuteDate-group 的哪一行。所以目前这个查询 returns 每个组的任意行。将 PARTITION BY ExecuteDate ORDER BY ExecuteDate DESC
更改为 f.e。 PARTITION BY ExecuteDate ORDER BY AnotherDateOrIdColumn DESC
以获得更有意义的结果。
你的意思是这样的:
SELECT distinct top 10 ROW_NUMBER() OVER(ORDER BY ExecuteDate DESC), ExecuteDate
FROM [ClubEatc].[dbo].[GetOnlineBills]
ORDER BY ExecuteDate DESC
您可以使用:
SELECT TOP 10 ExecuteDate
FROM (
SELECT ExecuteDate,
ROW_NUMBER() over (PARTITION BY ExecuteDate ORDER BY ExecuteDate DESC) as RN
FROM [GetOnlineBills]
) as t
WHERE RN = 1
ORDER BY ExecuteDate DESC
或者:
SELECT TOP 10 ExecuteDate
FROM (
SELECT TOP 1 WITH TIES ExecuteDate
FROM [GetOnlineBills]
ORDER BY ROW_NUMBER() over (PARTITION BY ExecuteDate ORDER BY ExecuteDate DESC)
) as t
ORDER BY ExecuteDate DESC
我是 SQL 服务器的新手,有一个这样的查询:
SELECT distinct top 10 ExecuteDate
FROM [ClubEatc].[dbo].[GetOnlineBills]
ORDER BY ExecuteDate DESC
我应该在该查询中使用 Row_Number
,我该如何编写该查询?
谢谢大家。
如果您希望每一行都有一个数字并且 ExecuteDate 应该不同:
WITH CTE AS
(
SELECT DISTINCT ExecuteDate FROM [ClubEatc].[dbo].[GetOnlineBills]
)
SELECT TOP 10 ExecuteDate, RN = ROW_NUMBER() OVER (ORDER BY ExecuteDate DESC)
FROM CTE
ORDER BY ExecuteDate DESC
或 GROUP BY
:
SELECT TOP 10 ExecuteDate, RN = ROW_NUMBER() OVER (ORDER BY ExecuteDate DESC)
FROM [ClubEatc].[dbo].[GetOnlineBills]
GROUP BY ExecuteDate
ORDER BY ExecuteDate DESC
也许您想查看整个记录,但只是每个 ExecuteDate-Group 的第一个。那么这个查询将起作用:
WITH CTE AS
(
SELECT ExecuteDate,
RN_DESC = ROW_NUMBER() OVER (PARTITION BY ExecuteDate
ORDER BY ExecuteDate DESC)
FROM [ClubEatc].[dbo].[GetOnlineBills]
)
SELECT TOP 10 ExecuteDate
FROM CTE
WHERE RN_DESC = 1
ORDER BY ExecuteDate DESC
您可以列出所有列,而不仅仅是 ExecuteDate
列。但是 ExecuteDate
是分组依据的列,您没有告诉我们您要使用哪一列来对每个组进行排序,因此您没有告诉我们您希望看到每个 ExecuteDate-group 的哪一行。所以目前这个查询 returns 每个组的任意行。将 PARTITION BY ExecuteDate ORDER BY ExecuteDate DESC
更改为 f.e。 PARTITION BY ExecuteDate ORDER BY AnotherDateOrIdColumn DESC
以获得更有意义的结果。
你的意思是这样的:
SELECT distinct top 10 ROW_NUMBER() OVER(ORDER BY ExecuteDate DESC), ExecuteDate
FROM [ClubEatc].[dbo].[GetOnlineBills]
ORDER BY ExecuteDate DESC
您可以使用:
SELECT TOP 10 ExecuteDate
FROM (
SELECT ExecuteDate,
ROW_NUMBER() over (PARTITION BY ExecuteDate ORDER BY ExecuteDate DESC) as RN
FROM [GetOnlineBills]
) as t
WHERE RN = 1
ORDER BY ExecuteDate DESC
或者:
SELECT TOP 10 ExecuteDate
FROM (
SELECT TOP 1 WITH TIES ExecuteDate
FROM [GetOnlineBills]
ORDER BY ROW_NUMBER() over (PARTITION BY ExecuteDate ORDER BY ExecuteDate DESC)
) as t
ORDER BY ExecuteDate DESC