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中的select语句where条件group by ,having , order by,limit的顺序及用法