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 = 1が最新であったため、IDを注文フィールドとして直接使用することはできませんが、今後はすべての新しいレコードがXよりも高いIDを取得します。したがって、最も古いレコードのID値であるXを識別する必要があります。今。次に、2つのケースで注文できます。

  • それは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を使用して、この順序で新しいテーブルに挿入できます。私は新しい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

ROW_NUMBER別の列を追加せずに古いIDを再利用する場合は、上記で使用できます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 に答える