繁体   English   中英

SQL - Select 基于多种条件的最新记录

[英]SQL - Select latest record based on multiple conditions

我有下表。

+----+--------+--------+------------+
| ID | Parent | Status |    Date    |
+----+--------+--------+------------+
|  1 |    667 | O      | 2019-09-23 |
|  1 |    667 | O      | 2019-10-01 |
|  1 |    667 | C      | 2019-10-12 |
|  1 |    667 | O      | 2019-10-31 |
| 33 |    566 | C      | 2019-09-28 |
| 33 |    566 | C      | 2019-10-03 |
| 33 |    566 | C      | 2019-10-17 |
| 33 |    566 | C      | 2019-10-23 |
| 33 |    566 | C      | 2019-10-29 |
|  2 |    667 | O      | 2019-10-01 |
|  2 |    667 | O      | 2019-10-12 |
|  2 |    667 | C      | 2019-10-31 |
| 34 |    566 | O      | 2019-10-03 |
| 34 |    566 | O      | 2019-10-17 |
| 34 |    566 | C      | 2019-10-23 |
| 34 |    566 | C      | 2019-10-29 |
+----+--------+--------+------------+

现在我需要在2019-10-012019-10-31之间的表格中找到所有ID在此期间具有状态O并且根据最新记录具有状态C的所有 ID。

预期 Output:

+----+--------+--------+------------+
| ID | Parent | Status |    Date    |
+----+--------+--------+------------+
|  2 |    667 | C      | 2019-10-31 |
| 34 |    566 | C      | 2019-10-29 |
+----+--------+--------+------------+

我试过查询

SELECT ID, Parent, Status, Date
FROM tabe WHERE Status='C' AND DATE >= '2019-10-01' AND Date <= '2019-10-31' AND ID IN (
    SELECT DISTINCT ID FROM tabe WHERE Status='O' AND Date >= '2019-10-01' AND Date <= '2019-10-31'
);

并得到以下 output

+----+--------+--------+------------+
| ID | Parent | Status |    Date    |
+----+--------+--------+------------+
|  1 |    667 | C      | 2019-10-12 |
|  2 |    667 | C      | 2019-10-31 |
| 34 |    566 | C      | 2019-10-23 |
| 34 |    566 | C      | 2019-10-29 |
+----+--------+--------+------------+

任何帮助深表感谢。

您指定您想要的 id。 因此,您可以使用聚合和having子句:

select id
from t
where date >= '2019-10-01' and date < '2019-11-01'
group by id
having sum( status = 'O' ) > 0 and
       max(case when status = 'C' then date end) = max(date);

如果您确实想要原始行,可以使用JOININEXISTS或 window 函数。 对于后者:

select t.*
from (select t.*,
             sum(status = 'O') over (partition by id) as num_os,
             first_value(status) over (partition by id order by date desc) as last_status
      from t
      where date >= '2019-10-01' and date < '2019-11-01'
     ) t
where num_os > 0 and last_status = 'C';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM