MySQL - GROUP BY,分组时只选择第一行

Posted

技术标签:

【中文标题】MySQL - GROUP BY,分组时只选择第一行【英文标题】:MySQL - GROUP BY, select only the first row when grouping 【发布时间】:2019-06-23 07:59:53 【问题描述】:

我在将特定列归为一列时遇到问题。当我使用 GROUP BY 时,最后一行应该是第一行时总是被选中。

主要查询是:

SELECT cpme_id, 
       medicine_main_tbl.med_id, 
       Concat(med_name, ' (', med_dosage, ') ', med_type) AS Medicine, 
       med_purpose, 
       med_quantity, 
       med_expiredate 
FROM   medicine_main_tbl 
       JOIN medicine_inventory_tbl 
         ON medicine_main_tbl.med_id = medicine_inventory_tbl.med_id 
WHERE  Coalesce(med_quantity, 0) != 0 
       AND Abs(Datediff(med_expiredate, Now())) 
ORDER  BY med_expiredate; 

SELECT without GROUP BY

如果我GROUP BY 使用任何重复的列值(在这种情况下,我使用了 med_id):

SELECT with GROUP BY

我正在尝试获取此输出

Expected Output

输出应该只是第一个查询的前两个。显然,我不能使用 LIMIT。

【问题讨论】:

你的预期输出是什么 预期输出应该是第一个查询中的前两行。 如果您的版本是“旧”,请参阅我添加的标签。 【参考方案1】:

由于您使用的是 MariaDB,我建议在这里使用ROW_NUMBER

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY med_id ORDER BY med_expireDate) rn
    FROM yourTable
)

SELECT cpme_id, med_id, Medicine, med_purpose, med_quantity, med_expireDate
FROM cte
WHERE rn = 1;

这假定给定药物的“第一”行是具有最早过期日期的药物。这是对您的数据的唯一解释,与预期输出一致。

【讨论】:

如果要求从分组数据中获取第一行而不是row_number,我认为rank() 会给出预期的结果? @AnkitJaiswal 不,RANK(或DENSE_RANK)如果有并列第一名,将返回多个记录。 ROW_NUMBER 总是只会返回一条记录。至于他想要什么,这取决于 OP。 @TimBiegeleisen 这正是我要找的!非常感谢!

以上是关于MySQL - GROUP BY,分组时只选择第一行的主要内容,如果未能解决你的问题,请参考以下文章

mysql中“group by、having、order by、limit”的顺序及用法是啥?

mysql中“group by、having、order by、limit”的顺序及用法是啥?

MySQL group by后取每个分组中最新一条数据

mysql中的select语句where条件group by ,having , order by,limit的顺序及用法

Laravel 按日期分组,如 MySQL 查询 GROUP BY MONTH(fields) [关闭]

mysql中group by里面的问题