为每个组选择null或最新日期

92dk7w1h  于 2021-06-18  发布在  Mysql
关注(0)|答案(5)|浏览(387)

如果有多个帐户具有相同的项目,我尝试先选取结束日期为空的帐户,然后选择最新日期
表格示例

预期结果

Select distinct * 
from Sample
where End Date is null

需要帮助来显示输出。

aiazj4mn

aiazj4mn1#

在派生表中,可以确定 end_date_to_considerItem (使用 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)
     )
ar7v8xwq

ar7v8xwq2#

Select * 
from Sample 
order by End_Date is not null, End_date desc
gstyhher

gstyhher3#

SELECT * FROM YourTable ORDER BY End_Date IS NOT NULL, End_Date DESC
siv3szwd

siv3szwd4#

根据示例,在我看来,您需要并集,而不是最近的子查询

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
                )
l0oc07j2

l0oc07j25#

首先,您应该清楚地说明您想要哪些结果行:您想要每个项目和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;

(如果enddate的值可能是9999-12-31,并且您希望null优先于此值,那么您必须在查询中考虑这一点,即您不能再简单地在null的情况下使用此日期,查询将变得更加复杂。)

相关问题