是否可以使用 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 <= '2018-05-30 14:28:32'
中的第二个条件是用户输入issue_date <= ?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 子句在查询结果中指定代表组的行的选择?的主要内容,如果未能解决你的问题,请参考以下文章