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

我需要将这些数据插入到我的第二个表“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

假设时间戳是唯一的,您可以自行加入表并从中进行选择。(如果不是,说明不是由您的数据唯一定义的)。

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 回答
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 回答