2

我有一张表,新数据以 开头id=1并增加id,我们得到旧数据,现在的问题是,因为每天都会添加新数据,我想显示从新到旧的结果,会有一个问题。我想颠倒表格的顺序,即使添加了新数据,我也可以显示从新到旧的数据。

有谁知道我该怎么做?

4

2 回答 2

1

您可以硬编码发生切换的任意数字。假设您现在有 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
于 2012-10-21T08:53:12.480 回答
1

最好在datetime表中添加一个字段。

但是,您的 ID 不能直接用作订单字段,因为到目前为止 ID=1 是最新的,但从现在开始,每条新记录的 ID 都将高于 X。因此,您需要确定 X 是最旧记录的 ID 值,直到现在。然后您可以按两种情况订购:

  • 它属于low-id=new还是high-id=new组?

这是一个示例,其中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按顺序插入到新表中了。我会使用一个新IDIDENTITY(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_NUMBERwith 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

演示:http ://sqlfiddle.com/#!6/00213/1/0

于 2012-10-21T08:53:53.037 回答