2

タイトルが悪かったのでごめんなさい-やりたいことを何と呼べばいいのかわからない。

ここに行きます:

MS SQLServer2008の場合

次のようなWITHステートメントで作成された4000行以上の一時テーブルがあります。

ID(varchar)DATE(int)

AB1135000097 | 20151221
AB1135000097 | 20160119
AB1135000097 | 20160219
AB1135001989 | 20120223
AB1135001989 | 20120323
AB1135001989 | 20120423


DATEに基づく日付範囲のデータをペアリングしたいと思います。

AB1135000097 | 20151221 | 20160119
AB1135000097 | 20160119 | 20160219
AB1135001989 | 20120223 | 20120323
AB1135001989 | 20120323 | 20120423

このアクションには名前がありますか?(私が何を求めているかがわかったら、投稿にタグを追加します)

4

3 に答える 3

4

想定されるスキーマ

私はあなたのテーブルが次のようなものだと思います:

CREATE TABLE "TABLE"
(
    tag     CHAR(1) NOT NULL,
    value   INTEGER NOT NULL,
    PRIMARY KEY(tag, value)
);

ただし、スキーマを推測する必要はありません。

考えられる答え

表面的には、あなたは後かもしれません:

SELECT t1.tag, t1.value, t2.value
  FROM "TABLE" AS t1
  JOIN "TABLE" AS t2
    ON t1.tag = t2.tag AND t2.value = t1.value + 1
 ORDER BY t1.tag, t1.value;

これにより、テーブルがそれ自体と結合され、tag列の値(、、A... B)が同じで、一方の行のvalue列がもう一方の行の列より1つ多い行が結合valueされます。

一方、('A', 5)テーブルに行を追加し、それが行の一部として出力に表示されることを期待する場合、('A', 3, 5)OLAP機能を使用せずにクエリを作成するのははるかに困難です。

于 2012-07-03T13:16:39.107 に答える
1

Oracleデータベースを使用している場合は、次のクエリを参照してこの質問を解決できます-

with t as
(
SELECT 'A' Col1, 1 Col2
  FROM Dual
UNION ALL
SELECT 'A' Col1, 2 Col2
  FROM Dual
UNION ALL
SELECT 'A' Col1, 3 Col2
  FROM Dual
UNION ALL
SELECT 'B' Col1, 4 Col2
  FROM Dual
UNION ALL
SELECT 'B' Col1, 5 Col2
  FROM Dual
UNION ALL
SELECT 'B' Col1, 6 Col2 FROM Dual
)
SELECT *
  FROM (SELECT Col1,
               Col2,
               Lead(Col1) Over(ORDER BY Col1, Col2) Col3,
               Lead(Col2) Over(ORDER BY Col1, Col2) Col4
          FROM t  --(your table name)
         ORDER BY Col1, Col2)
 WHERE Col1 = Col3

テーブル名とテーブル構造がないため、クエリ自体に1つの一時テーブルを作成しました。

テーブル名をに変更From tする必要があり ます。From..それに応じてcol1とcol2の列名も変更してください。

于 2012-07-03T13:19:11.163 に答える
1

私は自分の問題の解決策を見つけました。JonathanLefflerのソリューションに触発されました。どうもありがとう!

これは、IDとDATEの順序でテーブルに行番号を追加し、次にROW + 1と自己結合して、次の日付を2番目の日付列として取得することに基づいています。

with 
SCHEDULE as
( -- remove duplicates and NULL entries

    select DISTINCT ID, DATE from TABLE1
    where DATE IS NOT NULL
),

SCHEDULE_WITH_ROW as
(
select * from (
    select DISTINCT ROW_NUMBER()
        OVER (ORDER BY ID, DATE) AS
        ROW, ID, DATE 
    from SCHEDULE) AS SCHED
)

select 
    S1.ID
    , S1.DATE
    , S2.DATE
from SCHEDULE_WITH_ROW S1
    join SCHEDULE_WITH_ROW S2 on S2.ID = S1.ID and S1.ROW + 1 = S2.ROW 
于 2012-07-04T12:44:24.363 に答える