簡體   English   中英

SQL如何獲取分組表中表中列的最大值的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM