我有一個表,其中包含應用程式名稱、服務器名稱和該記錄的來源(3 個唯一來源)。表可以包含相同的應用程式名稱、服務器名稱,但任何記錄的來源不同,有時對于一個應用程式,它可以出現在一個來源中而不是另一個來源中。現在我想找出三個場景的記錄。我正在嘗試使用 except 但不作業,有人可以給我查詢嗎?
桌子
| 應用程式 | 服務器 | 資源 |
|---|---|---|
| 美國廣播公司 | 123 | 一個 |
| 美國廣播公司 | 123 | 乙 |
| 美國廣播公司 | 123 | C |
| 定義 | 456 | 一個 |
| 定義 | 456 | 乙 |
| 吉 | 789 | 一個 |
| jkl | 012 | 乙 |
| jkl | 012 | C |
場景:服務器在
| 源代碼 A | 源B | 源C | 行動 |
|---|---|---|---|
| 是的 | 是的 | 是的 | 無動作 |
| 是的 | 不 | 不 | 添加到 B |
| 是的 | 是的 | 不 | 添加到 C |
| 不 | 是的 | 是的 | 從 B 和 C 中洗掉 |
預期輸出:無需顯示 abc 123,因為它存在于所有 3 個來源中
| 應用程式 | 服務器 | 行動 |
|---|---|---|
| 定義 | 456 | 添加到 C |
| 吉 | 789 | 添加到 B |
| jkl | 012 | 從 B 和 C 中洗掉 |
uj5u.com熱心網友回復:
您可以按照您的描述分組app并繼續操作:server
SELECT app, server
CASE
WHEN has_a AND has_b AND has_c
THEN 'No action'
WHEN has_a AND NOT has_b AND NOT has_c
THEN 'add to B'
WHEN has_a AND has_b AND NOT has_c
THEN 'add to C'
WHEN NOT has_a AND has_b AND has_c
THEN 'remove from B and C'
END AS action
FROM (SELECT app, server,
bool_or(source = 'A') AS has_a,
bool_or(source = 'B') AS has_b,
bool_or(source = 'C') AS has_c
FROM tab
GROUP BY app, server) AS grouped;
請注意,action對于您的問題中未提及的情況,這將為 NULL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/519437.html
標籤:PostgreSQL
