如果有更多相同项目的帐户,我会尝试先提取“结束日期为NULL”的帐户,然后再提取最新日期。
表样本
预期结果
Select distinct *
from Sample
where End Date is null
需要帮助来显示输出。
答案 0 :(得分:1)
根据示例,在我看来您需要联合并且不存在corelate子查询
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
)
答案 1 :(得分:0)
Select *
from Sample
order by End_Date is not null, End_date desc
答案 2 :(得分:0)
SELECT * FROM YourTable ORDER BY End_Date IS NOT NULL, End_Date DESC
答案 3 :(得分:0)
end_date_to_consider
确定Item
(使用GROUP BY Item
)。 IF()
MIN()
日期是NULL
,则我们考虑NULL
,否则我们考虑MAX()
日期。Item
和end_date
上的主表中,以获取所需的行。尝试:
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)
)
答案 4 :(得分:0)
首先,您应该清楚说明所需的结果行:您希望每个Item和TOU包含一个结果行。对于每个Item / TOU对,您都希望具有最高日期的行,而null为优先级(即被认为是最高日期)。
这是正确的吗?这对您的真实帐户有效吗?在您的示例中,一个账户的所有行始终具有比所有其他账户行更高的日期。如果您的真实帐户不是这种情况,那么您需要比以下解决方案更复杂的方法。
您可以在MySQL中存储的最高日期是9999-12-31。使用它来按需要处理空日期。然后只有两个步骤:
查询:
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;
(如果结束日期的值可能为9999-12-31,并且您希望null优先于此,那么您必须在查询中考虑这一点,即,在以下情况下,您不能再简单地使用此日期: null,查询将变得更加复杂。)