[英]How to select an entire row based on multiple max date columns
我想选择整个行,该行已被2个最大日期列过滤-
因此,如果我有一张桌子(供应):
D_id |O_id | O_date | Start_date| amount
400 |1 | 2018-2-7 | 2018-4-7 | 500
401 |1 | 2019-8-2 | 2019-10-1 | 1500
402 |1 | 2019-8-2 | 2019-12-7 | 200
403 |2 | 2016-4-10 | 2016-5-7 | 100
404 |2 | 2018-12-1 | 2018-12-17| 50
405 |2 | 2018-12-1 | 2019-1-1 | 2500
因此,输出应按d_id分组,并显示具有最大O_date和最大start_date的整个行
D_id |O_id | O_date | Start_date | amount |
402 |1 | 2019-8-2 | 2019-12-7 | 200
405 |2 | 2018-12-1 | 2019-1-1 | 2500
我一直面临的问题只是通过使用max和group by条件,SQL不匹配每一行的字段。
select max(O_DATE),
MAX(START_DATE),
D_ID,
AMOUNT,
O_ID
FROM SUPPLY
group by
O_ID;
以下查询应为您工作。 按照您的逻辑,START_DATE对于这两种情况都是通用的,只有START_DATE之间的联接才可以解决问题。
SELECT * FROM SUPPLY A
INNER JOIN
(
SELECT O_ID,
MAX(O_DATE) O_DATE,
MAX(START_DATE) START_DATE
FROM SUPPLY
group by O_ID
)B
ON A.O_ID = B.O_ID
AND A.START_DATE = B.START_DATE
这是您要寻找的:
select
t1.D_id, t1.O_id, t2.o_date, t2.Start_date, t1.amount
from SUPPLY t1
outer apply (
select O_id, Max(O_date) as o_date, MAX(Start_date) as Start_date from SUPPLY
group by O_id
) as t2 where t2.O_id = t1.O_id and t2.o_date = t1.O_date and t2.Start_date = t1.Start_date
您可以通过将查询加入表来做到这一点:
SELECT s.*
FROM SUPPLY s INNER JOIN (
SELECT
max(O_DATE) O_DATE,
max(START_DATE) START_DATE
FROM SUPPLY
GROUP BY O_ID
) g ON g.O_ID = s.O_ID AND g.O_DATE = s.O_DATE AND g.START_DATE = s.START_DATE
或不存在:
SELECT s.*
FROM SUPPLY s
WHERE NOT EXISTS (
SELECT 1 FROM SUPPLY
WHERE O_ID = s.O_ID AND O_DATE > s.O_DATE AND START_DATE > s.START_DATE
)
O_DATE
的优先级高于START_DATE
select *
from SUPPLY t
join (
select MAX(t.START_DATE) maxSd, m.maxOd, t.O_ID
from SUPPLY t
join (
select max(O_DATE) maxOd, O_ID
from SUPPLY
group by O_ID
) m on m.O_ID = t.O_ID and m.maxOd = t.O_DATE;
group by m.maxOd, t.O_ID
) m2 on m2.O_ID = t.O_ID and m2.maxOd = t.O_DATE and m2.maxSd = t.START_DATE
由于8可以用WINDOW函数简化
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.