簡體   English   中英

Select 行與其他兩列的每個唯一組合的 Max(列值)

[英]Select rows with Max(Column Value) for each unique combination of two other columns

我正在使用如下示例表。 一個數據集有多個組,每次寫入表時,數據集的 RunNumber 以及每個組的數據和總數都會增加。 每個數據集/組組合通常會有多行,示例如下:

運行編號 團體 數據集 全部的
1 第 1 組 數據集 A 10
1 第 1 組 數據集 A 20
2 第 1 組 數據集 A 30
2 第 2 組 數據集 A 15
1 第 1 組 數據集 B 5
1 第 2 組 數據集 B 10
1 第 3 組 數據集 A 30
2 第 3 組 數據集 A 30
1 第 1 組 數據集 C 15
1 第 2 組 數據集 C 50
2 第 2 組 數據集 C 70
2 第 2 組 數據集 C 90

我想要做的對於數據集和組的每個組合都是必不可少的,返回具有給定數據集/組組合的 max(RunNumber) 的行的所有數據。 例如,上面的示例將返回:

運行編號 團體 數據集 全部的
2 第 1 組 數據集 A 30
2 第 2 組 數據集 A 15
1 第 1 組 數據集 B 5
1 第 2 組 數據集 B 10
2 第 3 組 數據集 A 30
1 第 1 組 數據集 C 15
2 第 2 組 數據集 C 70
2 第 2 組 數據集 C 90

在數據集/組匹配的地方,所有行都保留給定組合的最大 RunNumber。 目前,我已將其拆分為 2 個單獨的查詢,其中我首先查詢所有不同數據集/組組合的 max(RunNumber),然后對所有匹配項執行 select *。 任何幫助將不勝感激,在此先感謝!

在 MySQL 5.x 中,您可以使用子查詢。

SELECT * 
FROM your_table
WHERE (`Group`, Dataset, RunNumber) IN (
    SELECT `Group`, Dataset, MAX(RunNumber) AS MaxRunNumber
    FROM your_table
    GROUP BY `Group`, Dataset
  );

這里測試 db<>fiddle

備擇方案

--
-- LEFT JOIN on bigger
--
SELECT t.* 
FROM your_table t
LEFT JOIN your_table t2
  ON t2.`Group` = t.`Group`
 AND t2.Dataset = t.Dataset
 AND t2.RunNumber > t.RunNumber
WHERE t2.RunNumber IS NULL
ORDER BY t.`Group`, t.Dataset;

--
-- where NOT EXISTS on bigger
--
SELECT * 
FROM your_table t
WHERE NOT EXISTS (
  SELECT 1
  FROM your_table t2
  WHERE t2.`Group` = t.`Group`
    AND t2.Dataset = t.Dataset
    AND t2.RunNumber > t.RunNumber
)
ORDER BY `Group`, Dataset;

--
-- DENSE_RANK = 1
-- MySql 8 and beyond. 
--
SELECT *
FROM
(
  SELECT *
  , DENSE_RANK() OVER (PARTITION BY `Group`, Dataset ORDER BY RunNumber DESC) AS rnk
  FROM your_table
) q
WHERE rnk = 1
ORDER BY `Group`, Dataset;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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