[英]SQL how to get rows with max value of a column in the table in grouped rows
我有一個帶有列('name','maj','min','patch')的表,每個名稱可以有幾個主要/次要/補丁版本。 對於每個名稱,我需要獲取該主要/次要的最大“補丁”的主要和次要值。
例如表“數據”
|id|name|maj|min|patch|
|1 |n1 |1 |0 | 1 |
|2 |n1 |1 |0 | 2 |
|3 |n1 |1 |0 | 3 |
|4 |n2 |1 |0 | 1 |
|5 |n2 |2 |0 | 1 |
|6 |n2 |2 |0 | 2 |
預期產量:
|id|name|maj|min|patch|
|3 |n1 |1 |0 | 3 |
|4 |n2 |1 |0 | 1 |
|6 |n2 |2 |0 | 2 |
我只能設法按這些字段對數據進行分組並排序,但我不知道僅針對每個主要/次要獲得具有最大補丁的行
SELECT id, name, maj, min, patch FROM data group by name, maj, min order by name, patch desc
以下查詢接近您想要的內容:
SELECT
name,
maj,
`min`,
MAX(patch) AS patch
FROM data
GROUP BY
name,
maj,
`min`;
但是,這不包括id
列,它不是聚合查詢的一部分。 如果您想采用一種通用方法來包括整個匹配的行,請考慮使用ROW_NUMBER
:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY name, maj, `min` ORDER BY patch DESC) rn
FROM data
)
SELECT id, name, maj, `min`, patch
FROM cte
WHERE rn = 1;
有不存在:
select t.* from tablename t
where not exists (
select 1 from tablename
where name = t.name and maj = t.maj and min = t.min and patch > t.patch
)
參見演示 。
結果:
| id | name | maj | min | patch |
| --- | ---- | --- | --- | ----- |
| 3 | n1 | 1 | 0 | 3 |
| 4 | n2 | 1 | 0 | 1 |
| 6 | n2 | 2 | 0 | 2 |
您也可以使用相關子查詢來執行此操作:
selet t.*
from t
where t.patch = (select max(t2.patch)
from t t2
where t2.name = t.name and
t2.maj = t.maj and
t2.min = t.min
);
如果您的數據庫很大,則索引(name, maj, min, patch)
將提供良好的性能。
您可以簡單地使用擁有子句來實現它。
SELECT id, name, maj, min, max(patch) AS max_patch FROM data GROUP BY patch DESC HAVING MAX(patch) >1;
希望對您有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.