我的表格如下:
ID | col1 | Date Time
1 | WA | 2/11/20
1 | CI | 1/11/20
2 | CI | 2/11/20
2 | WA | 3/11/20
3 | WA | 2/10/20
3 | WA | 1/11/20
3 | WA | 2/11/20
4 | WA | 1/10/20
4 | CI | 2/10/20
4 | SA | 3/10/20
我想查找所有col1除WA之外还具有其他值的ID值,而col1中的最新值应为'WA'。即,从上面的示例数据中,仅应返回ID值1和2。因为这两个值在WA之外都具有附加值(即CI),但它们的最新值仍然是WA。
我该怎么办?
仅供参考,可能有些ID根本没有WA值。我想消除它们。还有那些只具有WA值的那些,我也想消除那些。
感谢您的帮助。
您可以为此使用窗口功能:
select distinct id
from (
select
t.*,
last_value(col1) over(partition by id oder by datetime) last_col1,
min(col1) over(partition by id) min_col1,
max(col1) over(partition by id) max_col1
from mytable t
) t
where last_col1 = 'WA' and min_col1 <> max_col1
内部查询使用last_value()
恢复给定col1
的id
的last值,并计算同一分区中的最小值和最大值。
然后,外部查询过滤最后一个值为id
且具有至少两个不同值(表示为最小值和最大值的不等式)的'WA'
。
您可以通过聚合来做到这一点:
select id
from t
group by id
having min(col1) <> max(col1) and -- at least two different values
max(case when col1 = 'WA' then datetime end) = max(datetime) -- last is WA