【问题标题】:MySQL - GROUP BY, select only the first row when groupingMySQL - GROUP BY,分组时只选择第一行
【发布时间】:2023-03-21 02:37:01
【问题描述】:

我在将特定列归为一列时遇到问题。当我使用 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。

【问题讨论】:

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

标签: mysql mariadb groupwise-maximum


【解决方案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 这正是我要找的!非常感谢!
猜你喜欢
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
相关资源
最近更新 更多