我正在使用如下示例表。一個資料集有多個組,每次寫入表時,資料集的 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 *。任何幫助將不勝感激,在此先感謝!
uj5u.com熱心網友回復:
在 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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/417205.html
標籤:
