【问题标题】:How to select an entire row based on multiple max date columns如何根据多个最大日期列选择整行
【发布时间】:2019-06-27 09:50:43
【问题描述】:

我想选择整行,它已被 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;

【问题讨论】:

  • 样本数据不佳。为最大 O_date 和最大 start_date 值添加一个具有不同行的 O_id。 (并相应地调整结果。)
  • 如果最大 O_date 和最大 start_date 属于 2 个单独的行怎么办?而且您的意思一定是 GROUP BY o_id 而不是 d_id - 对吧?
  • 是否存在 max o_date 可能没有 max start_date 的情况(反之亦然)
  • GROUP BY d_id 会将所有 5 行视为 5 个不同的 GROUP。
  • 是的,查询应该返回具有最大 o_date 和最大 start_date 的整行,有时对于每个 o_id 的 o_date 将是相同的,在这些情况下我们选择具有最大 start_date 的行.

标签: mysql sql


【解决方案1】:

以下查询应该适合您。对于您的逻辑,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

【讨论】:

    【解决方案2】:

    您可以通过将您的查询加入到表中来做到这一点:

    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 
    )
    

    【讨论】:

      【解决方案3】:

      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 函数来简化

      【讨论】:

        【解决方案4】:

        这就是你要找的东西:

        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
        

        【讨论】:

          猜你喜欢
          • 2016-01-31
          • 1970-01-01
          • 1970-01-01
          • 2016-06-10
          • 2016-09-04
          • 2022-01-19
          • 1970-01-01
          • 1970-01-01
          • 2021-08-19
          相关资源
          最近更新 更多