Sql 如何删除重复项以便表中只存在对?

Sql 如何删除重复项以便表中只存在对?,sql,postgresql,Sql,Postgresql,我有一个ticket_事件表,显示签入和签出时间戳 timestamp type 2018-12-26 02:46:01 IN 2018-12-26 02:46:13 IN 2018-12-26 03:17:57 OUT 2018-12-26 04:12:13 IN 2018-12-26 04:12:25 IN 2018-12-26 04:35:41 OUT 2018-12-26 04:35:53 OUT 2018-12-26 05:11:05 IN 2018-12-

我有一个ticket_事件表,显示签入和签出时间戳

timestamp               type
2018-12-26 02:46:01 IN
2018-12-26 02:46:13 IN
2018-12-26 03:17:57 OUT
2018-12-26 04:12:13 IN
2018-12-26 04:12:25 IN
2018-12-26 04:35:41 OUT
2018-12-26 04:35:53 OUT
2018-12-26 05:11:05 IN
2018-12-26 06:03:42 OUT
2018-12-26 06:03:55 OUT
2018-12-26 06:04:43 IN
2018-12-26 06:04:50 IN
2018-12-26 06:28:07 OUT
2018-12-26 06:28:19 OUT
2018-12-26 07:00:11 IN
2018-12-26 07:00:22 IN
2018-12-26 07:19:13 OUT
2018-12-26 07:59:21 IN
2018-12-26 08:24:57 OUT
我只希望表中出现IN-OUT对,没有连续的IN或OUT。例如,我想:

timestamp               type
2018-12-26 02:46:01 IN
2018-12-26 03:17:57 OUT
2018-12-26 04:12:13 IN
2018-12-26 04:35:41 OUT
2018-12-26 05:11:05 IN
2018-12-26 06:03:42 OUT
2018-12-26 06:04:43 IN
2018-12-26 06:28:07 OUT
2018-12-26 07:00:11 IN
2018-12-26 07:19:13 OUT
2018-12-26 07:59:21 IN
2018-12-26 08:24:57 OUT
有人知道用sql查询来实现这一点吗

我现在的问题是

select timestamp, type from ticket_events where ticket_uuid='value'

要删除前一行具有相同类型的任何行。因此:

select timestamp, type
from (select t.*,
             lag(type) over (order by timestamp) as prev_type
      from ticket_events t
     ) t
where prev_type <> type or prev_type is null;
如果要删除“有问题”的行,可以执行以下操作--假设
时间戳
是唯一的:

delete from ticket_events
    using (select t.*,
                  lag(type) over (order by timestamp) as prev_type
           from ticket_events t
          ) tt
    where tt.timestamp = t.timestamp and
          tt.prev_type = t.type;

这是一个缺口和孤岛问题

您可以使用
ROW\u NUMBER
window函数获取间隙,然后使用
groupby
with
min

SELECT MIN(timestamp) "timestamp",
       type
FROM (
    SELECT *,
           ROW_NUMBER() OVER(ORDER BY timestamp)-
           ROW_NUMBER() OVER(PARTITION BY type ORDER BY timestamp) gap
    FROM ticket_events 
    where ticket_uuid='value'
) t1
GROUP BY gap,type
ORDER BY MIN(timestamp) 

|            timestamp | type |
|----------------------|------|
| 2018-12-26T02:46:01Z |   IN |
| 2018-12-26T03:17:57Z |  OUT |
| 2018-12-26T04:12:13Z |   IN |
| 2018-12-26T04:35:41Z |  OUT |
| 2018-12-26T05:11:05Z |   IN |
| 2018-12-26T06:03:42Z |  OUT |
| 2018-12-26T06:04:43Z |   IN |
| 2018-12-26T06:28:07Z |  OUT |
| 2018-12-26T07:00:11Z |   IN |
| 2018-12-26T07:19:13Z |  OUT |
| 2018-12-26T07:59:21Z |   IN |
| 2018-12-26T08:24:57Z |  OUT |
|            timestamp | type |
|----------------------|------|
| 2018-12-26T02:46:01Z |   IN |
| 2018-12-26T03:17:57Z |  OUT |
| 2018-12-26T04:12:13Z |   IN |
| 2018-12-26T04:35:41Z |  OUT |
| 2018-12-26T05:11:05Z |   IN |
| 2018-12-26T06:03:42Z |  OUT |
| 2018-12-26T06:04:43Z |   IN |
| 2018-12-26T06:28:07Z |  OUT |
| 2018-12-26T07:00:11Z |   IN |
| 2018-12-26T07:19:13Z |  OUT |
| 2018-12-26T07:59:21Z |   IN |
| 2018-12-26T08:24:57Z |  OUT |