我有一张表,新数据以 开头id=1
并增加id
,我们得到旧数据,现在的问题是,因为每天都会添加新数据,我想显示从新到旧的结果,会有一个问题。我想颠倒表格的顺序,即使添加了新数据,我也可以显示从新到旧的数据。
有谁知道我该怎么做?
我有一张表,新数据以 开头id=1
并增加id
,我们得到旧数据,现在的问题是,因为每天都会添加新数据,我想显示从新到旧的结果,会有一个问题。我想颠倒表格的顺序,即使添加了新数据,我也可以显示从新到旧的数据。
有谁知道我该怎么做?
您可以硬编码发生切换的任意数字。假设您现在有 1,000 行(所以 #1 是最新的,但 #1001 在添加时将是最新的):
SELECT (CASE WHEN id < 1000 THEN id * -1 ELSE id END) AS sort_order
ORDER BY sort_order DESC
可能更好的解决方案是添加一个时间戳列,因为依赖自动生成的列来获取真实数据并不好。
编辑
要创建一个新表,请将上面的内容与插入一起使用。
INSERT INTO [new_table] (col1,col2,col3, ...)
SELECT (col1, col2, col3, ...)
FROM [old_table]
ORDER BY (CASE WHEN id < 1000 THEN id * -1 ELSE id END) DESC
最好在datetime
表中添加一个字段。
但是,您的 ID 不能直接用作订单字段,因为到目前为止 ID=1 是最新的,但从现在开始,每条新记录的 ID 都将高于 X。因此,您需要确定 X 是最旧记录的 ID 值,直到现在。然后您可以按两种情况订购:
这是一个示例,其中X=10
:
SELECT ID
FROM dbo.tbl
ORDER BY CASE WHEN ID <=10 THEN ID ELSE -ID END ASC
这是小提琴:http ://sqlfiddle.com/#!6/95c9a/3/0
但我想将内容复制到新表中,这样我就不需要区别对待它们
然后就可以使用上面的sql按顺序插入到新表中了。我会使用一个新ID
列IDENTITY(1,1)
:
INSERT INTO dbo.tblCopy
SELECT ID
FROM dbo.tbl
ORDER BY CASE WHEN ID <=10 THEN ID ELSE -ID END ASC
如果您不想添加另一列并且想要重用旧 id,可以使用ROW_NUMBER
with above CASE
:
INSERT INTO dbo.tblCopy
SELECT ID =
ROW_NUMBER()OVER(ORDER BY CASE WHEN ID <=10 THEN ID ELSE -ID END ASC)
FROM dbo.tbl