显示一列的变化,该列在外部被另一列过滤

时间:2018-11-09 12:04:51

标签: sql postgresql

我有一张这样的桌子:

jpeg

首先,我需要列出所有无效的变量,每个变量的名称存储在colA上,其值存储在colB上。

为此,我正在使用分区窗口,特别是考虑到我正在LAG函数Postgres上运行。

Table T:

    colA    |    colB     |    colDate
-----------------------------------------------
     A      |     5       |  2018-11-07 00:00:00
     A      |     7       |  2018-11-07 12:00:00
     A      |     7       |  2018-11-08 23:05:00
     A      |     7       |  2018-11-09 06:15:00
     A      |     7       |  2018-11-09 00:00:00
     B      |     25      |  2018-11-07 00:00:00
     B      |     27      |  2018-11-07 12:00:00
     B      |     27      |  2018-11-08 23:05:00
     B      |     27      |  2018-11-09 06:15:00
     B      |     27      |  2018-11-09 00:00:00
作为结果的

select colA, colB, colDate from (
    select colA, colB, colDate,
        lag(colB) over (partition by colA order by colDate) prev_colB
    from T
    order by colA, colDate
) Tsmart
where
Tsmart.colB != Tsmart.prev_colB or Tsmart.prev_colB is null

问题是,从创建 colA | colB | colDate ----------------------------------------------- A | 5 | 2018-11-07 00:00:00 A | 7 | 2018-11-07 12:00:00 B | 25 | 2018-11-07 00:00:00 B | 27 | 2018-11-07 12:00:00 开始,我需要在Tsmart上过滤此表。

例如,我只希望从colDate开始发生变化。 我希望像这样的桌子

2018-11-09

但是,当然,如果我像以前一样进行选择,仅在外部添加 colA | colB | colDate ----------------------------------------------- A | 7 | 2018-11-09 06:15:00 A | 7 | 2018-11-09 00:00:00 B | 27 | 2018-11-09 06:15:00 B | 27 | 2018-11-09 00:00:00 过滤器,则会得到一个空表。

colDate

假设我无法在select colA, colB, colDate from ( select colA, colB, colDate, lag(colB) over (partition by colA order by colDate) prev_colB from T order by colA, colDate ) Tsmart where (Tsmart.colB != Tsmart.prev_colB or Tsmart.prev_colB is null) and Tsmart.colDate > '2018-11-09 00:00:00' 内的colDate上移动过滤器,有没有办法获取我想要的东西?

编辑:更好地解释了这个问题

2 个答案:

答案 0 :(得分:0)

这回答了问题的原始版本。

您不是想要简单的聚合吗?

select colA, colB, min(coldate)
from t
group by colA, colB;

然后您可以将日期条件添加为wherehaving条件-完全取决于您的意图(您希望日期之后的“第一个日期”;还是要日期之后的第一个日期,即使之前有一个日期也是如此。

我应该补充一点,如果您实际上想要更多列,则可以使用distinct on

select distinct on (colA, colB) t.*
from t
group by colA, colB, coldate;

答案 1 :(得分:0)

我终于找到了解决方案。确实非常简单,它包括将前一个时间戳记添加到该行,然后,如果前一个值与当前值不同,前一个为null或前一个时间戳与日期过滤器不匹配,则接受该行。 / p>

在实践中:

select colA, colB, colDate from (
    select colA, colB, colDate
        lag(colB) over (partition by colA order by colDate) prev_colB,
        lag(colDate) over (partition by colA order by colDate) prev_colDate,
    from T
    order by colA, colDate
) Tsmart
where
    (Tsmart.colB != Tsmart.prev_colB or Tsmart.prev_colB is null
        or Tsmart.prev_colDate < '2018-11-09 00:00:00')
and Tsmart.colDate > '2018-11-09 00:00:00'