2016-09-15 56 views
-2

我是一个新的SQL Server,并具有以下查询:如何在此查询中使用ROW_NUMBER?

SELECT distinct top 10 ExecuteDate 
FROM [ClubEatc].[dbo].[GetOnlineBills] 
ORDER BY ExecuteDate DESC 

我应该用在查询Row_Number,我怎么可以编写查询?

谢谢大家。

+3

我们有**你想放什么样的目的没有**的想法'ROW_NUMBER()'到。 –

+0

添加更多关于你的问题的细节,row_number顺序是什么,你想分区,如果是的话,那么在什么? – Monah

回答

1

如果你想有一个编号为每一行和每一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组的哪一行。所以目前这个查询返回每个组的任意一行。将PARTITION BY ExecuteDate ORDER BY ExecuteDate DESC更改为f.e. PARTITION BY ExecuteDate ORDER BY AnotherDateOrIdColumn DESC以获得更有意义的结果。

+0

谢谢,但如何使用哪里cluase,例如哪里行= 1? –

+0

你为什么需要这个?这不是'ROW_NUMBER()OVER(PARTITION BY ORDER BY ExecuteDate DESC)'。每个行号都不同于上面的。如果你只想要第一行然后在我的数据库中使用'SELECT TOP 1' –

+0

返回两个值不同:1395/6/17和1395/6/11,当使用顶部只显示我1395/6/17,并且想要获得1395/6/11的价值。 –

1

你的意思是这样的:

SELECT distinct top 10 ROW_NUMBER() OVER(ORDER BY ExecuteDate DESC), ExecuteDate 
FROM [ClubEatc].[dbo].[GetOnlineBills] 
ORDER BY ExecuteDate DESC 
1

您可以使用:

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 
+0

的感谢,但是这里WHERE RN = 1向我展示了两行! –

+0

而第二个查询? 'SELECT DISTINCT ExecuteDate FROM [GetOnlineBills]'它将返回多少行 – gofr1

+0

SELECT DISTINCT ExecuteDate FROM [GetOnlineBills]返回我两条记录,我想要在哪里访问所有行,例如row = 1,row = 2 –