如何根据多个最大列值选择一行?
Posted
技术标签:
【中文标题】如何根据多个最大列值选择一行?【英文标题】:How can I select a row based on mutiple max column values? 【发布时间】:2019-06-28 10:00:34 【问题描述】:我有几张表,因为它有设备 IDS,所以我都加入了“表 1”。
D_ID | U_ID |
1 | 100
2 | 101
3 | 102
然后我将它与表 2 和表 3 连接起来,分别包含订单信息和产品细节
表2-
O_id | order_date | D_id
10 | 2018-2-3 | 1
10 | 2019-5-4 | 1
11 | 2017-1-6 | 2
11 | 2019-2-8 | 2
12 | 2018-10-3 | 3
表 3-
P_ID | START_DATE | END_DATE | D_ID
20 | 2018-5-3 | 2018-6-3 | 1
21 | 2019-6-8 | 2019-6-13| 1
22 | 2017-2-8 | 2017-2-8 | 2
23 | 2019-4-2 | 2019-5-2 | 2
24 | 2018-11-1 | 2018-11-3| 3
我的输出应该能够按 D_ID 分组并选择具有最大 order_date 和最大 start_date 的整行。
预期输出-
D_ID |U_ID |O_ID | ORDER_DATE | START_DATE | END_DATE | P_ID
1 |100 |10 | 2019-5-4 | 2019-6-8 | 2019-6-13 | 21
2 |101 |11 | 2019-2-8 | 2019-4-2 | 2019-5-2 | 23
3 |103 |12 | 2018-10-3 | 2018-11-1 | 2018-11-3 | 24
SELECT T1.D_ID, T1.u_id,
T2.ORDER_DATE, t2.o_id,
t3.start_date, t3.end_date, t3.P_ID
FROM t1 left JOIN
t3
ON t3.d_id = t1.d_id left JOIN
t2 ON t2.d_id = t1.d_id
where t2.order_date in (select max(order_date) from t2 group by d_id
) and
t3.start_date in (select max(start_date) from t3 group by d_id
)
group by t1.d_id;
但是我面临的问题是列值不匹配,它不会占用我同时拥有最大订单日期和开始日期的整行。
【问题讨论】:
我建议您阅读mysql Handles GROUP BY,因为您的 GROUP BY 用法在这里看起来不正确,除非 MySQL 可以使用功能依赖。 分享mysql版本和样本数据以及预期输出 Mysql server version is 8.0.17 我已经分享了上面的预期输出 【参考方案1】:你想要相关的子查询,而不是IN
:
where t2.order_date = (select max(t2.order_date)
from t2
where t2.d_id = t1.d_id
) and
t3.start_date = (select max(t3.start_date)
from t3
where t3.d_id = t1.d_id
)
这将获得最大值每个d_id
。您的方法只是列出所有 d_id
s 的所有最大值,然后将它们与 all 日期进行比较。因此,比较可能匹配 不同 d_id
。
【讨论】:
以上是关于如何根据多个最大列值选择一行?的主要内容,如果未能解决你的问题,请参考以下文章
SQL:如何根据窗口框架中的聚合最小值/最大值选择列值(包括前面的行)