NTILE函数,记录数错误

时间:2013-07-09 12:05:12

标签: sql sql-server

考虑这个问题:

SELECT DISTINCT x.*
FROM (
        SELECT DISTINCT Id,
            VideoId,
            [Date],
            NTILE(2) OVER(ORDER BY VideoId) AS tile_nr
        FROM
            [Database].[dbo].[Table] a
     ) x
WHERE
    CONVERT(Date, [Date]) = CONVERT(Date, GETDATE())

视频总行数为3320.使用NTILE功能,我可以将列表分为两部分。所以当我把AND放在最后时:

AND
    x.tile_nr = 1

它将返回结果集的前半部分。问题,或者我认为是一个问题,是第一个结果集大多数时候包含1656个记录。但有时包含1657条记录。因此,当我还检索结果集的后半部分时,总数有时会达到3321。我怎样才能避免这种情况发生?

1 个答案:

答案 0 :(得分:1)

如果您查看NTile的BOL条目,您会看到以下评论http://msdn.microsoft.com/en-us/library/ms175126.aspx

  

如果分区中的行数不能被整除   integer_expression,这将导致两个大小不同的组   一个成员。较大的组在订单中的较小组之前   由OVER子句指定。例如,如果总行数   是53,组的数量是5,前三组将   有11行,其余两组每行10行。如果   另一方面,总行数可以被数字整除   对于组,行将在组之间均匀分布。对于   例如,如果总行数是50,并且有五个组,   每个桶将包含10行。

话虽如此,您可能必须将结果保存在临时表中,因为行计数可能会在多次执行之间发生变化,最终可能会出现不同的组/总数。如果您返回临时表而不是返回基表,则可以保证数据相同。