我有一张这样的桌子:
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
上移动过滤器,有没有办法获取我想要的东西?
编辑:更好地解释了这个问题
答案 0 :(得分:0)
这回答了问题的原始版本。
您不是想要简单的聚合吗?
select colA, colB, min(coldate)
from t
group by colA, colB;
然后您可以将日期条件添加为where
或having
条件-完全取决于您的意图(您希望日期之后的“第一个日期”;还是要日期之后的第一个日期,即使之前有一个日期也是如此。
我应该补充一点,如果您实际上想要更多列,则可以使用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'