我已經嘗試從這里為每組分組的 SQL 結果答案獲取具有最大值的記錄。但它只需要按一列分組。我需要幾個。所以我在這里發布問題。
我有一個資料集(用戶表)如下,
ID Username Status
1 John Active
2 Mike Active
3 Ann Deactive
4 Leta Active
5 Lena Active
6 Lara Active
7 Mitch Active
此外,我有一個如下的收入表,其中包含每個用戶的子字串。
subuser hour Revenue
John_01 2/26/2022 5:00 5
Mike_01 2/26/2022 7:00 8
Mike_01 2/26/2022 7:00 22
Leta_03 2/26/2022 7:00 67
Leta_07 2/26/2022 9:00 56
Mitch_07 2/26/2022 11:00 34
我需要將每個子用戶與用戶表中的主用戶(例如:John_01==John)進行匹配,并獲得每個用戶的收入總和。但是,如果為每個子用戶重復小時,我需要獲得每個子用戶的最大收入。
舉個例子,我需要用 22 獲得收入,應該忽略 8。
Ex:
Mike_01 2/26/2022 7:00 8
Mike_01 2/26/2022 7:00 22
所以決賽桌應該如下所示。
User Total_Usage
John 5
Mike 22
Leta 123
Lena 0
Lara 0
Mitch 34
這是我的嘗試。
SELECT u.Username
, COALESCE(SUM(Revenue), 0) AS TOTAL_USAGE
FROM usertable u
LEFT JOIN revenuetb e
ON SUBSTRING_INDEX(e.subuser, '_', 1) = u.Username
AND e.Hour BETWEEN 'XXX' and 'XXX'
where u.STATUS='Active'
GROUP BY u.Username
order by u.ID
;
但這并沒有忽略重復的小時數。有人可以解釋我該怎么做嗎?
限制:無法在我的遠程服務器中使用視窗功能。
uj5u.com熱心網友回復:
只需使用派生表來獲取MAX(revenue)每個(user, hour)組。
然后對每個用戶的結果求和:
小提琴
SELECT username, SUM(MAX_USAGE) AS TOTAL_USAGE
FROM (
SELECT u.Username, e.hour
, COALESCE(MAX(Revenue), 0) AS MAX_USAGE
FROM usertable u
LEFT JOIN revenuetb e
ON SUBSTRING_INDEX(e.subuser, '_', 1) = u.Username
AND e.Hour BETWEEN xxx and yyy
WHERE u.STATUS='Active'
GROUP BY u.Username, e.hour
) AS derived
GROUP BY Username
;
結果:
| 用戶名 | TOTAL_USAGE |
|---|---|
| 約翰 | 5 |
| 勞拉 | 0 |
| 莉娜 | 0 |
| 萊塔 | 123 |
| 麥克風 | 22 |
| 米奇 | 34 |
關于日期/時間的小作弊。但基本邏輯是一樣的。
對于您的初始 SQL,我使用 MariaDB 來避免您的 GROUP BY 錯誤報告。MariaDB 仍然無法識別函式依賴錯誤,就像舊版本的 MySQL(5.7 之前)一樣。
5.7 之前的 MySQL 也允許這樣做。
最終解決方案在所有版本中都可以正常作業,因為它不包含功能依賴錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/433444.html
