Sql NTILE函数,记录数错误

Sql NTILE函数,记录数错误,sql,sql-server,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]

考虑这个查询:

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
    x.tile_nr = 1

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

如果您查看NTile的BOL条目,您将看到以下注释

如果分区中的行数不能被 整数_表达式,这将导致两个大小的组相差 一名成员。在顺序中,较大的组排在较小的组之前 由OVER条款指定。例如,如果总行数 是53组,5组,前三组 有11行,其余两个组各有10行。如果 另一方面,行的总数可以被数字整除 对于组,行将在组之间均匀分布。对于 例如,如果总行数为50,并且有五个组, 每个桶将包含10行


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

VideoId
[表]
中是否唯一?
我不认为
VideoId
是唯一的,我建议您使用秩函数对它们进行分页。@LuisLL是的,它们是唯一的。@MartinSmith啊忘了删除,只是为了测试目的。在我看来,您正在将数据一分为二,然后应用一个条件(其中),这不可能生成两个大小相同的集合。