如果我可以使用任何獨特的功能,我正在使用雪花來解決這個 SQL 問題,請幫幫我!
我有一個具有唯一 ID 的資料集,其他不重要的屬性,然后是每個唯一 ID 可能落入的類別串列(~22)(如果它在類別中,則用 1 表示,如果不是,則用 0 表示。)
我試圖弄清楚如何寫一些東西,我可以看到是否在所有類別中,如果一個類別被洗掉,如果任何唯一 ID 將被留下沒有任何類別并計算有多少唯一 ID 然后總共有多少ids 將減少類別。
下面的示例對于唯一 id Jshshsv 它僅在 CatAA 中,但 id Hairbdb 在 CatY 和 CatAA 中。如果 CatAA 被洗掉,會有多少 Id 沒有類別?
| 唯一身份 | 跨類別求和 | 貓X | 貓 | 貓Z | CatAA |
|---|---|---|---|---|---|
| 頭發資料庫 | 2 | 0 | 1 | 0 | 1 |
| Jshshsv | 1 | 0 | 0 | 0 | 1 |
出于某種原因,我只是無法弄清楚如何在具有這么多類別存盤桶的 sql 中以可管理的方式執行此操作。任何提示或嘗試的事情將不勝感激。
uj5u.com熱心網友回復:
如果您將類別存盤在列中(雖然不是一個好的設計),您可以試試這個。
SELECT UniqueID , sum(CatX CatY CatZ CatAA) over (partition by UniqueID) as "Sum across Categories",
CatX, CatY, CatZ, CatAA FROM (
SELECT 'Hairbdb' as UniqueID, 0 as CatX, 1 as CatY, 0 as CatZ, 1 as CatAA from dual
UNION ALL
SELECT 'Jshshsv', 0,0,0,1 from dual
);
uj5u.com熱心網友回復:
因此,如果您的資料是成對的,重復 ID|Cat --|-- Hairbdb|CatY Hairbdb|CatY Hairbdb|CatAA Jshshsv|CatAA Jshshsv|CatAA
以下 SQL 可用于查找類別是 ID 的單一匹配項。
WITH data AS (
SELECT * FROM VALUES
('Hairbdb','CatY'),
('Hairbdb','CatAA'),
('Jshshsv','CatAA')
v(id, cat)
), dist_data AS (
SELECT DISTINCT id, cat FROM data
), cat_counts AS (
SELECT id, count(distinct cat) c_cat
FROM data
GROUP BY 1
HAVING c_cat = 1
)
SELECT a.cat, a.id
FROM dist_data AS a
JOIN cat_counts AS b
ON b.id = a.id;
這是有效的,因為您首先計算每個 id,id 所在的類別,然后將不同的資料與 id 僅在一只貓中的資料連接起來,將為您提供 id 和 cat
| 貓 | ID |
|---|---|
| CatAA | Jshshsv |
如果您的資料采用寬格式(就像您呈現它的方式一樣),您可以通過 UNPIVOT 將其轉換為我的表單,如下所示:
WITH data AS (
SELECT * FROM VALUES
('Hairbdb',0,1,0,1),
('Jshshsv',0,0,0,1)
v(id, catx, caty, catz, cataa )
)
SELECT id, cat from data unpivot(catv for cat in (catx, caty, catz, cataa))
WHERE catv = 1;
給予:
| ID | 貓 |
|---|---|
| 頭發資料庫 | 貓 |
| 頭發資料庫 | CATAA |
| Jshshsv | CATAA |
但是,如果它在您的表單中洗掉了重復項,您可以只使用 WHERE 子句:
WITH data AS (
SELECT * from values
('Hairbdb', 0, 1, 0, 1),
('Jshshsv', 0, 0, 0, 1)
v(UniqueID, CatX,CatY,CatZ, CatAA)
)
SELECT UniqueID,
CatX CatY CatZ CatAA as "Sum across Categories",
CatX,
CatY,
CatZ,
CatAA
FROM data
WHERE "Sum across Categories" = 1;
所以另一種變體,如果每個 id 有很多行,并且整個集合中的類別分配不同,則可以使用 COUNT_IF 和大于 0 的測驗將資料轉換為任何中的資料,然后使用 HAVING 子句過濾掉許多列中的那些
WITH data AS (
SELECT * FROM VALUES
('Hairbdb',0,1,0,1),
('Hairbdb',1,1,0,1),
('Hairbdb',0,1,1,1),
('Jshshsv',0,0,0,1),
('Jshshsv',0,0,0,1)
v(id, catx, caty, catz, cataa )
)
SELECT id,
COUNT_IF(catx=1)>0 AS catx_a,
COUNT_IF(caty=1)>0 AS caty_a,
COUNT_IF(catz=1)>0 AS catz_a,
COUNT_IF(cataa=1)>0 AS cataa_a
FROM data
GROUP BY 1
HAVING catx_a::int caty_a::int catz_a::int cataa_a::int = 1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422029.html
標籤:
