如何在SQL中进行分区和查找最新值

问题描述 投票:0回答:2

我的表格如下:

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值的那些,我也想消除那些。

感谢您的帮助。

sql amazon-redshift partition database-partitioning
2个回答
0
投票

您可以为此使用窗口功能:

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()恢复给定col1idlast值,并计算同一分区中的最小值和最大值。

然后,外部查询过滤最后一个值为id且具有至少两个不同值(表示为最小值和最大值的不等式)的'WA'


0
投票

您可以通过聚合来做到这一点:

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
© www.soinside.com 2019 - 2024. All rights reserved.