我有一張如下表。
| ID | 帳戶ID | sha256 | 尺寸 |
|---|---|---|---|
| 1 | 1 | 美國廣播公司 | 120 |
| 2 | 1 | 美國廣播公司 | 120 |
| 3 | 1 | bcd | 150 |
| 4 | 2 | 美國廣播公司 | 120 |
| 5 | 2 | 定義 | 80 |
| 6 | 3 | 喂 | 100 |
| 7 | 3 | 喂 | 100 |
我需要找到大小列的總和,但一個帳戶的相同 sha256 應該只添加一次。要添加的行應如下所示。
| ID | 帳戶ID | sha256 | 尺寸 |
|---|---|---|---|
| 1 | 1 | 美國廣播公司 | 120 |
| 3 | 1 | bcd | 150 |
| 4 | 2 | 美國廣播公司 | 120 |
| 5 | 2 | 定義 | 80 |
| 6 | 3 | 喂 | 100 |
由于每個帳戶的 sha256 值重復,第 2 行和第 7 行被洗掉。第 4 行沒有被洗掉,因為它屬于不同的帳戶,即使它具有相同的 sha256,并且總和應該是 570。
在下面的查詢中嘗試過,但在“distinct”處或附近給出了語法錯誤。
SELECT SUM(f.size) FROM
(SELECT account_id, DISTINCT sha256, size FROM files GROUP BY account_id, sha256, size) f
uj5u.com熱心網友回復:
使用DISTINCT ON:
SELECT SUM(size) AS total
FROM
(
SELECT DISTINCT ON (account_id, sha256, size) size
FROM FILES
ORDER BY account_id, sha256, size, id
) t;
上述邏輯為每組值保留(account_id, sha256, size)對應于最低值的單個記錄id。然后將這組記錄按大小相加得到總數。
uj5u.com熱心網友回復:
您可以總結account_id,sha256和的不同組合size:
SELECT SUM(size) total_size
FROM (SELECT DISTINCT account_id, sha256, size FROM files) f;
請參閱演示。
uj5u.com熱心網友回復:
你的資料
CREATE TABLE test(
id INTEGER NOT NULL
,account_id INTEGER NOT NULL
,sha256 VARCHAR(40) NOT NULL
,size INTEGER NOT NULL
);
INSERT INTO test
(id,account_id,sha256,size) VALUES
(1,1,'abc',120),
(2,1,'abc',120),
(3,1,'bcd',150),
(4,2,'abc',120),
(5,2,'def',80),
(6,3,'fed',100),
(7,3,'fed',100);
用于Row_number區分重復值
SELECT SUM(f.size) AS total
FROM (SELECT id,
account_id,
sha256,
size,
Row_number ()
OVER (
partition BY account_id, sha256, size
ORDER BY id ASC ) rn
FROM test) f
WHERE rn = 1
小提琴手
uj5u.com熱心網友回復:
歸結為:
SELECT sum(size) AS total
FROM (SELECT DISTINCT ON (account_id, sha256) size FROM files) sub;
關于DISTINCT ON:
- 在每個 GROUP BY 組中選擇第一行?
您沒有提到相同的情況size會有所不同(account_id, sha256)。我想那是因為出于某種未公開的原因,這永遠不會發生。如果發生這種情況,您需要明確定義要做什么......
uj5u.com熱心網友回復:
這是另一個..
WITH
files AS
(
Select 1 "ID", 1 "ACCOUNT_ID", 'abc' "SHA256", 120 "SZ" From Dual UNION ALL
Select 2 "ID", 1 "ACCOUNT_ID", 'abc' "SHA256", 120 "SZ" From Dual UNION ALL
Select 3 "ID", 1 "ACCOUNT_ID", 'bcd' "SHA256", 150 "SZ" From Dual UNION ALL
Select 4 "ID", 2 "ACCOUNT_ID", 'abc' "SHA256", 120 "SZ" From Dual UNION ALL
Select 5 "ID", 2 "ACCOUNT_ID", 'def' "SHA256", 80 "SZ" From Dual UNION ALL
Select 6 "ID", 3 "ACCOUNT_ID", 'fed' "SHA256", 100 "SZ" From Dual UNION ALL
Select 7 "ID", 3 "ACCOUNT_ID", 'fed' "SHA256", 100 "SZ" From Dual
)
SELECT DISTINCT
Min(f.ID) OVER(PARTITION BY f.ACCOUNT_ID, f.SHA256 ORDER BY f.ACCOUNT_ID, f.SHA256) "ID",
f.ACCOUNT_ID "ACCOUNT_ID",
f.SHA256 "SHA256",
f.SZ "SIZE"
FROM
files f
ORDER BY
f.ACCOUNT_ID,
f.SHA256
--
-- Result
-- ID ACCOUNT_ID SHA256 SIZE
-- 1 1 abc 120
-- 3 1 bcd 150
-- 4 2 abc 120
-- 5 2 def 80
-- 6 3 fed 100
Min(f.ID) OVER(.....) 是組的第一個 ID (ACCOUNT_ID, SHA256),DISTINCT 只給我們不同的行,其余的是您要求的值。如果將大小相加,您將得到 570... 問候...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/482493.html
標籤:sql PostgreSQL 和 清楚的
下一篇:用于從多行中提取單行的SQL查詢
