1

重複の可能性:
SQLで同じIDで挿入する行を選択する方法は?

「table_1」というテーブルがあります:

ID   Index          STATUS          TIME        DESCRIPTION
1     15          pending           1:00       Started Pending
1     16          pending           1:05       still in request
1     17          pending           1:10       still in request
1     18          complete          1:20       Transaction has been completed
2     19          pending           2:25       request has been started
2     20          pending           2:30       in progress
2     21          pending           2:35       in progess still
2     22          pending           2:40       still pending
2     23          complete          2:45       Transaction Compeleted

これらのデータを 2 番目のテーブル「table_2」に挿入する必要があります。ここには開始時間と完了時間のみが含まれているため、「table_2」は次のようになります。

ID   Index   STATUS          TIME          DESCRIPTION
1     15     pending         1:00          Started Pending
1     18     complete        1:20          Transaction has been completed
2     19     pending         2:25          request has been started
2     23     complete        2:45          Transaction Completed

これは私がすでに持っているコードですGROUP BY。句に表示されないため、適切な関連する説明を取得するのに問題があります。

INSERT INTO myTable2 (ID, STATUS, TIME)
SELECT ID, STATUS, MIN(TIME) FROM myTable1 t1top
WHERE EXISTS(SELECT * FROM myTable1 WHERE ID=t1top.ID AND STATUS='Complete')
GROUP BY ID, STATUS
ORDER BY ID  ASC, STATUS DESC

誰かがこれのためのSQLクエリを書くのを手伝ってくれるなら、私はそれを高く評価します.

4

4 に答える 4

1
INSERT INTO myTable2 (ID, STATUS, TIME, DESCRIPTION)
SELECT t1.ID, t1.STATUS, t1.TIME, t1.DESCRIPTION FROM table_1 as t1 
WHERE STATUS = 'complete' 
OR TIME = (SELECT min(TIME) FROM table_1 WHERE ID = t1.ID) 
ORDER BY ID asc, STATUS desc
于 2012-06-02T23:12:18.990 に答える
0

これにはパーティション関数を使用できます。

SELECT a.ID, a.Index, a.STATUS, a.TIME, a.DESCRIPTION FROM
(
    SELECT ID, Index, STATUS, TIME, DESCRIPTION, 
    MIN(Index) OVER (PARTITION BY ID) AS first_index,
    MAX(CASE WHEN STATUS = 'complete' then 1 else 0 end) OVER (PARTITION BY ID) AS is_complete
   FROM myTable1
) a
WHERE a.is_complete = 1 AND (a.status = 'complete' OR a.index = a.first_index)

つまり、完了したイベントの最初と最後の行を選択します。

于 2012-06-02T22:55:30.970 に答える
0

タイムスタンプが一意であると仮定すると、テーブルを自己結合してそこから選択できます。(そうでない場合、説明はデータによって一意に定義されていません)。

INSERT INTO myTable2 (ID, STATUS, TIME, DESCRIPTION)
SELECT t1top.ID, t1top.STATUS, MIN(t1top.TIME), t1Copy.DESCRIPTION
FROM myTable1 t1top
    JOIN myTable1 t1Copy ON t1top.ID = t1Copy.ID
WHERE EXISTS(SELECT * FROM myTable1 WHERE ID=t1top.ID AND STATUS='Complete')
    AND MIN(t1top.TIME) = t1Copy.TIME
GROUP BY ID, STATUS
ORDER BY ID ASC, STATUS DESC
于 2012-06-02T22:48:07.193 に答える
0

次のようなことを試してください:

SELECT * FROM myTable1 WHERE DESCRIPTION = '%started%' OR DESCRIPTION = '%complete%' ORDER BY ID, STATUS
于 2012-06-02T22:50:01.667 に答える