选择NULL,否则选择每个组的最新日期

时间:2018-11-12 07:37:28

标签: mysql sql

如果有更多相同项目的帐户,我会尝试先提取“结束日期为NULL”的帐户,然后再提取最新日期。

表样本

enter image description here

预期结果

enter image description here

Select distinct * 
from Sample
where End Date is null

需要帮助来显示输出。

5 个答案:

答案 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)

  • Derived Table中,可以为每个end_date_to_consider确定Item(使用GROUP BY Item)。 IF() MIN()日期是NULL,则我们考虑NULL,否则我们考虑MAX()日期。
  • 现在,我们可以将其重新连接到Itemend_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。使用它来按需要处理空日期。然后只有两个步骤:

  1. 获得每个项目和每个表头的最高日期。
  2. 获取这些项目,标题和日期的行。

查询:

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,查询将变得更加复杂。)