连接和/或子查询或排名函数
Posted
技术标签:
【中文标题】连接和/或子查询或排名函数【英文标题】:Joins and/or Sub queries or Ranking functions 【发布时间】:2021-10-30 05:41:31 【问题描述】:我有一张如下表:
Order_ID | Ship_num | Item_code | Qty_to_pick | Qty_picked | Pick_date |
---|---|---|---|---|---|
1111 | 1 | 1 | 3000 | 0 | Null |
1111 | 1 | 2 | 2995 | 1965 | 2021-05-12 |
1111 | 2 | 1 | 3000 | 3000 | 2021-06-24 |
1111 | 2 | 2 | 1030 | 0 | Null |
1111 | 3 | 2 | 1030 | 1030 | 2021-08-23 |
2222 | 1 | 3 | 270 | 62 | 2021-03-18 |
2222 | 1 | 4 | 432 | 0 | Null |
2222 | 2 | 3 | 208 | 0 | Null |
2222 | 2 | 4 | 432 | 200 | 2021-05-21 |
2222 | 3 | 3 | 208 | 208 | 2021-08-23 |
2222 | 3 | 4 | 232 | 200 | 2021-08-25 |
从这张表中, 我只想显示具有最新 ship_num 信息的行,而不是最新的 pick_date 信息(我被引导到这样的问题,需要返回具有最新进入时间的行,我不是在寻找)订单即,我想要它如下
Order_ID | Ship_num | Item_code | Qty_to_pick | Qty_picked | Pick_date |
---|---|---|---|---|---|
1111 | 3 | 2 | 1030 | 1030 | 2021-08-23 |
2222 | 3 | 3 | 208 | 208 | 2021-08-23 |
2222 | 3 | 4 | 232 | 200 | 2021-08-25 |
我尝试了以下查询,
select order_id, max(ship_num), item_code, qty_to_pick, qty_picked, pick_date
from table1
group by order_id, item_code, qty_to_pick, qty_picked, pick_date
任何帮助将不胜感激。
提前致谢。
【问题讨论】:
我已经在这个最新的问题中解释了(在中间),上一个问题的最佳答案与返回具有最新条目“时间”的行有关,我正在寻找 max(ship_num ) 以及与之相关的所有行。 你并没有真正解释,@Mupp,但我喜欢我评论过,这应该是对你原来问题的编辑,不是转发 哦,对不起,我实际上先尝试了编辑。下次我会记住这一点。我真的是堆栈溢出的新用户。再次抱歉。 我感觉其实最新的ship_num信息就是最新的pick_date对应的ship_num,是不是搞错了?在这种情况下,max()
函数可以放在这个日期,一个“简单”的分组应该可以工作
这能回答你的问题吗? Get top 1 row of each group
【参考方案1】:
您可以使用 DENSE_RANK() 获取此信息。
查询
;with cte as (
select rnk = dense_rank()
over (Partition by order_id order by ship_num desc)
, *
from table_name
)
Select *
from cte
Where rnk =1;
【讨论】:
能否请您解释一下您选择的对我来说是一个复杂查询的问题?而且这个查询中没有日期,据我了解,我们的朋友正在寻找 latest ship_num...我错了吗?我必须承认我对答案感到惊讶,我当然不会在这种方向上寻找答案,我想知道我是否真的理解了这个问题:-/感谢详细信息=) @Christophe:虽然“latest ship num”有点令人困惑,但我认为请求中清楚地表明了“greatest ship num”的含义。 OP 明确提到“不是最新的 pick_date”,他们自己使用 max(ship_num),并且显示的预期结果证实了这一点。【参考方案2】:使用max(ship_num)
是个好主意,但您应该使用分析版本(带有OVER
子句)。
select *
from
(
select t.*, max(ship_num) over (partition by order_id) as orders_max_ship_num
from table1 t1
) with_max
where ship_num = orders_max_ship_num
order by order_id, item_code;
【讨论】:
以上是关于连接和/或子查询或排名函数的主要内容,如果未能解决你的问题,请参考以下文章
无法对包含 MySql 中的聚合或子查询的表达式执行聚合函数