是否可以使用 group by 子句在查询结果中指定代表组的行的选择?

Posted

技术标签:

【中文标题】是否可以使用 group by 子句在查询结果中指定代表组的行的选择?【英文标题】:Is it possible to designate the selection of the row representing a group in the results of a query with a group by clause? 【发布时间】:2018-05-29 16:54:50 【问题描述】:

以下查询,

select shelf_id, issue_date, current_qty
from Stock
where barcode = '555' and issue_date <= '2018-05-30 14:28:32'

会给出以下结果,

10  2018-05-25 00:00:00 5
10  2018-05-28 00:00:00 55
5   2018-05-29 00:00:00 100

添加group by shelf_id 将导致该结果,

10  2018-05-25 00:00:00 5
5   2018-05-29 00:00:00 100

想要的结果如下。

10  2018-05-28 00:00:00 55
5   2018-05-29 00:00:00 100

这背后的原因是,对于每个组,我想返回具有最新issue_date 的组的行。

limit 1 将返回的组总数限制为一个, having issue_date... 将是一个可能的解决方案,但我不知道如何获得最接近 Max(issue_date) 的日期

是否有可能在不使用子查询的情况下完成此操作?

编辑: where 子句issue_date &lt;= '2018-05-30 14:28:32' 中的第二个条件是用户输入issue_date &lt;= ?2 用于初始过滤表,然后查询应按每个shelf_if 的结果分组,但返回与max(issue_date) 日期最近的行。所以我看不出我怎么能用子查询替换这个条件。

【问题讨论】:

SQL select only rows with max value on a column的可能重复 【参考方案1】:

不要使用group by!您正在尝试过滤行。这是一种方法:

select s.*
from stock s
where s.issue_date = (select max(s2.issue_date) from stock s2 where s2.shelf_id = s.shelf_id);

作为奖励,在stock(shelf_id, issue_date) 上有一个索引,性能应该比group by 更好。

【讨论】:

由于多个连接,表别名真的让我在 mysql 中遇到困难,我的问题中的查询是真实查询的更简单版本。我正在尝试实施您的答案,但到目前为止,我只得到包含一行的结果。 @Karapapas 。 . .您需要相关性子句才能获得多个结果。【参考方案2】:

如果你有 identify 列,那么你可以使用LIMIT 子句:

select s.*
from Stock s
where barcode = '555' and issue_date <= '2018-05-30 14:28:32' and 
      identity_col = (select identity_col
                      from Stock s1
                      where s1.shelf_id = s.shelf_id
                      order by s1.issue_date desc
                      limit 1
                     );

【讨论】:

If I have identify column 到底是什么意思。这是加入子查询的一种方式吗? @Karapapas。 . . identify 表示您的表数据排序已插入。【参考方案3】:

你可以这样试试

select ST.shelf_id, ST.issue_date, ST.current_qty
from Stock as ST INNER JOIN (select shelf_id, MAX(issue_date) AS issue_date
from Stock
where barcode = '555' and issue_date <= '2018-05-30 14:28:32'
GROUP BY shelf_id) AS A ON ST.shelf_id = A.shelf_id and ST.issue_date = A.issue_date

只要 (shelf_id,issue_date) 是唯一的,这应该可以,如果我错了请告诉我

【讨论】:

以上是关于是否可以使用 group by 子句在查询结果中指定代表组的行的选择?的主要内容,如果未能解决你的问题,请参考以下文章

GROUP BY,WHERE,HAVING之间的区别和用法

having是否依赖于group by

Pk 字段总是以结果查询 GROUP BY 子句结束

没有聚合功能的 GROUP BY 子句有啥原因吗?

group by 和 having子句

C# Linq group by 和 group by into 运用实例