SELECT t.*
FROM
Sample AS t
JOIN
(
SELECT
Item,
IF(MIN(end_date) IS NULL,
NULL,
MAX(end_date)) AS end_date_to_consider
FROM Sample
GROUP BY Item
) AS dt
ON dt.Item = t.Item AND
(dt.end_date_to_consider = t.end_date OR
(dt.end_date_to_consider IS NULL AND
t.end_date IS NULL)
)
select * from table_name t where t.enddate is null
union
select * from table_name t
where t.endate=( select max(enddate) from table_name t1 where t1.Item=t.Item and t1.Account=t.Account)
and not exists ( select 1 from table_name t2 where enddate is null and
t1 where t2.item=t.item
)
select * from
sample
where (item, tou, coalesce(enddate, date '9999-12-31') in
(
select item, tou, max(coalesce(enddate, date '9999-12-31'))
from sample
group by item, tou
)
order by item, tou;
5条答案
按热度按时间aiazj4mn1#
在派生表中,可以确定
end_date_to_consider
每Item
(使用GROUP BY Item
).IF()
这个MIN()
日期是NULL
,那么我们考虑NULL
,否则我们考虑MAX()
日期。现在,我们可以把它连接到
Item
以及end_date
获取所需的行。尝试:
ar7v8xwq2#
gstyhher3#
siv3szwd4#
根据示例,在我看来,您需要并集,而不是最近的子查询
l0oc07j25#
首先,您应该清楚地说明您想要哪些结果行:您想要每个项目和tou有一个结果行。对于每个item/tou对,您需要具有最高日期的行,null具有优先权(即被视为可能的最高日期)。
是这样吗?这对你的真实账户有用吗?在您的示例中,一个帐户的所有行的日期总是高于所有其他帐户行的日期。如果你的真实账户不是这样,你需要比下面的解决方案更复杂的东西。
mysql中可以存储的最高日期是9999-12-31。使用此选项可以根据需要处理空日期。那么只需两步:
获取每个项目和时间单位的最高日期。
获取这些项目、时间和日期的行。
查询:
(如果enddate的值可能是9999-12-31,并且您希望null优先于此值,那么您必须在查询中考虑这一点,即您不能再简单地在null的情况下使用此日期,查询将变得更加复杂。)