连接和/或子查询或排名函数

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基础九--子查询和连接

无法对包含 MySql 中的聚合或子查询的表达式执行聚合函数

SQL Server“不能对包含聚合或子查询的表达式执行聚合函数”,但 Sybase 可以

聚合和连接 2 个表或子查询

没有聚合或子查询的查询