MySQL - GROUP BY, select 分组时仅第一行
MySQL - GROUP BY, select only the first row when grouping
我在将特定列归为一列时遇到问题。当我使用 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。
由于您使用的是 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;
这假定给定药物的 "first" 行是具有最早失效日期的行。这是唯一符合预期输出的数据解释。
我在将特定列归为一列时遇到问题。当我使用 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。
由于您使用的是 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;
这假定给定药物的 "first" 行是具有最早失效日期的行。这是唯一符合预期输出的数据解释。