这个Partition By有什么问题

时间:2010-12-27 10:16:03

标签: tsql sql-server-2008

我有一个查询在一个时间列上使用分区,但结果有点出乎意料,这里有什么问题?为什么我在RN上获得多于1个? (一个用于21:00:02:100,另一个用于21:00:02:600)

SELECT TOP 500
    ROW_NUMBER() OVER(
                PARTITION BY [Date], CAST([Time] AS Time(0))
                ORDER BY [DATE] ASC, CAST([Time] AS Time(0)) ASC
               ) RN,
               [DATE],
               [Time]               
FROM [DB]..[TABLE]
ORDER BY [Date] ASC,
         [Time] ASC,
         [RN] ASC

结果:

**1 2010-10-03  21:00:02.100**
2   2010-10-03  21:00:02.100
3   2010-10-03  21:00:02.200
4   2010-10-03  21:00:02.200
5   2010-10-03  21:00:02.200
4   2010-10-03  21:00:02.500
**1 2010-10-03  21:00:02.600**
2   2010-10-03  21:00:02.600
3   2010-10-03  21:00:02.600
5   2010-10-03  21:00:02.700
6   2010-10-03  21:00:02.700
7   2010-10-03  21:00:02.700
8   2010-10-03  21:00:02.700
9   2010-10-03  21:00:02.700
10  2010-10-03  21:00:02.700
11  2010-10-03  21:00:02.700
12  2010-10-03  21:00:02.700
13  2010-10-03  21:00:02.700
14  2010-10-03  21:00:02.700
15  2010-10-03  21:00:02.700
16  2010-10-03  21:00:02.700
17  2010-10-03  21:00:02.700
18  2010-10-03  21:00:02.700
19  2010-10-03  21:00:02.700
20  2010-10-03  21:00:02.700
21  2010-10-03  21:00:02.700
22  2010-10-03  21:00:02.700

2 个答案:

答案 0 :(得分:2)

您正在使用CASTing time(0)进行排序,以便将时间转换(截断?)到第二精度。它的工作方式与宣传的一样......

编辑:

使用相同的PARTITION BY和ORDER BY ...

是没有意义的

我的猜测是你试图按秒进行分区,并希望在该间隔中使用行数

试试这个:

ROW_NUMBER() OVER(
            PARTITION BY [Date], CAST([Time] AS Time(0))
            ORDER BY [DATE], [Time]
           ) RN

如果你得到重复的行数超过0.5秒的边界,使用它来强制截断而不是ROUND

ROW_NUMBER() OVER(
            PARTITION BY [Date], CAST([Time] - '00:00:00.5000' AS Time(0))
            ORDER BY [DATE], [Time]
           ) RN

答案 1 :(得分:0)

非常感谢您的反馈,结果表明,演员阵容正在四舍五入,因此它不起作用(给我两倍的1)。从[TIME]减去对我不起作用,得到了一个错误。最后,我使用此代码使其按预期工作:

ROW_NUMBER() OVER( PARTITION BY CONVERT(nvarchar(8), [Time], 8) ORDER BY [Date], [Time]) RN FROM [DB]..[TABLE]