如何根据自然顺序选择表格的底部X行?我不能做“ORDER BY DESC ...”,因为我没有按任何列号订购它......
我正在使用Sql Server 2008 R2。
答案 0 :(得分:8)
SQL不保证表中行的顺序。它仅保证查询中具有显式ORDER BY
的行的顺序。依赖聚集索引也不明智。聚集索引可能会因为充分的原因,错误的原因或根本没有原因而被更改或删除。此外,不保证查询优化器以与聚簇索引相同的顺序返回行。如果没有明确的ORDER BY
,则无法保证从一次运行到下一次运行以相同的顺序返回行。 (优化器可以在任何时候做出不同的决定。)这些事情中的任何一个都可能会破坏您的代码。
相反,请使用查询。在时间戳列上降序排序。 (ORDER BY mytimestampcolumn DESC
)您可以将顶部的“n”行除去。由于您按降序排序,因此顶行是底行。 (无法抗拒。)
如果没有时间戳列,您可以尝试使用自动递增ID号列,尽管它们不能保证严格按时间顺序排列。 (获取id号为1000的事务可能会在获得数字999和998的事务之前提交。)
答案 1 :(得分:1)
我遇到过类似的事情。我有一个生成的文件,其中包含我每隔一天需要处理的数据。所以我通过文本ODBC DSN驱动程序建立了一个SQL链接服务器连接。这意味着上述关于设置指标的回复并不真正适用 - 因为数据只是“按原样”。
另一个问题 - 我必须保留行的顺序,所以如果我做ROW_NUMBER OVER (ORDER BY X PARITION BY Y)
它会“扭曲”数据(即:改变行序列)。
那该怎么办?
经过一番思考 - 我想知道MSSQLSERVER是否会保留数据的排序,如果它在每一行都有相同的排序,那么:
with data as (0 as dummy, * from MyTable)
select row_number() over (order by dummy) as rowID,
myTable.fieldA, myTable.fieldB from myTable
..这似乎给出了一个自然顺序的rownumber,或者至少是它的近似值。
无论如何 - 希望这可以帮助别人!
答案 2 :(得分:0)
如果您的桌子上有“聚集索引”,则表格按此顺序排列。如果表没有聚集索引,则表没有订单(它是堆表)。
如果它是一个堆表,我不知道如何获取最后的x行...如果它有一个聚簇索引你只需按列表排序聚簇索引列,你将得到最后的x记录...哎呀...嗯...假设你把它们放在clustred索引顺序中,即自动记录整数...抱歉需要考虑更多......
答案 3 :(得分:0)
Kim的原始问题表明,在这种情况下,ORDER BY DESC是不可能的。不过,他在评论中表示他有一个聚集索引。因此,他可以做ORDER BY DESC。
SELECT TOP xxx *
FROM blah
ORDER BY col1, col2, etc DESC