【问题标题】:Filter table : Keep N row after each row with special value过滤表:每行后保留 N 行具有特殊值
【发布时间】:2016-02-10 08:24:57
【问题描述】:

我有一个包含大量数据的表,具有这种结构(简化):

+--------+-------------------------+-------+
| id     | datetime                | type  | 
+--------+-------------------------+-------+
| 1      | 2015-08-13 17:50:41     | 1     |
| 2      | 2015-08-13 17:50:45     | 0     |
| 3      | 2015-08-14 17:50:56     | 0     |
| 4      | 2015-08-14 17:50:59     | 0     |
+--------+-------------------------+-------+

type=1 的行后面跟着很多 type=0 的行

我需要进行智能清洁:

  • 我希望仅在一小时内(在类型 1 行时间戳之后)将 type=0 的行与 type=1 的行保持一致
  • 每小时至少有一行 type=0

我不知道是否可以通过查询来做到这一点,或者我是否必须使用脚本遍历所有行。

我用的是 PostgreSQL

【问题讨论】:

  • 从包含大量数据的表中删除大量行通常是一项非常耗时的工作。你确定这是你想做的吗?

标签: sql postgresql


【解决方案1】:

我这里没有要测试的 postgres,但这应该会返回您想要保留的所有数据:

SELECT ID FROM (
SELECT ID FROM (SELECT 
  id,
  datetime,
  type,
  LAG(type) OVER (ORDER BY id asc) AS prev_type,
  LAG(datetime) OVER (ORDER BY id asc) AS prev_date
FROM employees
WHERE 
  type=1 AND
  prev_type=0 AND
  EXTRACT(EPOCH FROM (datetime - prev_date)) < 3601
  )

UNION  

SELECT MAX(ID) FROM employees GROUP BY TO_CHAR(datetime, 'DDMMYYYHH24'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2017-12-27
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多