考虑这个问题:
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。我怎样才能避免这种情况发生?
答案 0 :(得分:1)
如果您查看NTile的BOL条目,您会看到以下评论http://msdn.microsoft.com/en-us/library/ms175126.aspx。
如果分区中的行数不能被整除 integer_expression,这将导致两个大小不同的组 一个成员。较大的组在订单中的较小组之前 由OVER子句指定。例如,如果总行数 是53,组的数量是5,前三组将 有11行,其余两组每行10行。如果 另一方面,总行数可以被数字整除 对于组,行将在组之间均匀分布。对于 例如,如果总行数是50,并且有五个组, 每个桶将包含10行。
话虽如此,您可能必须将结果保存在临时表中,因为行计数可能会在多次执行之间发生变化,最终可能会出现不同的组/总数。如果您返回临时表而不是返回基表,则可以保证数据相同。