[英]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-01
和2019-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);
如果您确实想要原始行,可以使用JOIN
、 IN
、 EXISTS
或 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.