這是我的表:
project_id | task_id | task_name | task_status |
--------- --------- ----------- -------------
1 12 foo complete
2 13 foo complete
3 1210 bar complete
4 1211 bar none
5 1212 xyz none
6 1213 zyz none
我想創建查詢在那里我可以只選擇tasks_name其中task_status“完全”兩種task_id。例如,名稱foo有兩個(task_id例如 12 和 13)并且它們都已task_status完成的任務。相比之下,帶有名稱的任務bar只有一個task_id“已完成”,所以它屬于我的情況。我希望得到這樣的表:
project_id | task_id | task_name | task_status |
--------- --------- ----------- -------------
1 12 foo complete
2 13 foo complete
我如何選擇,檢查和回傳task_name每個task_id都相同的位置,并且它們都已task_status完成
uj5u.com熱心網友回復:
使用 min、max 和子查詢更容易做到這一點。
Select *
From Tbl
Where task_name In (Select task_name
From Tbl
Group by task_name
Having Min(task_status)=Max(task_status)
And Max(task_status)='complete')
資料輸出:
project_id | task_id | task_name | task_status
___________|_________|___________|____________
1 | 12 | foo | complete
2 | 13 | foo | complete
uj5u.com熱心網友回復:
所以這意味著,每個 task_name,完成的數量需要與總數相同。
select project_id, task_id, task_name, task_status from ( select * , count(case when task_status = 'complete' then 1 end) over (partition by task_name) as cnt_complete , count(*) over (partition by task_name) as cnt from yourtable ) q where cnt = cnt_complete
| 專案編號 | 任務編號 | 任務名稱 | 任務狀態 |
|---|---|---|---|
| 1 | 12 | 富 | 完全的 |
| 2 | 13 | 富 | 完全的 |
關于db<>fiddle 的演示在這里
uj5u.com熱心網友回復:
使用視窗函式過濾所有完整的任務名稱。
select project_id, task_id, task_name, task_status from
(
select *,
count(*) filter (where task_status = 'complete') over w = count(*) over w all_complete
from the_table window w as (partition by task_name)
) t
where all_complete;
uj5u.com熱心網友回復:
一種方法,使用決議函式:
WITH cte AS (
SELECT *, MIN(task_status) OVER (PARTITION BY task_name) min_task_status,
MAX(task_status) OVER (PARTITION BY task_name) max_task_status
FROM yourTable
)
SELECT project_id, task_id, task_name, task_status
FROM cte
WHERE min_task_status = max_task_status AND
min_task_status = 'complete';
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387377.html
標籤:sql PostgreSQL的
上一篇:Sqlite無回圈檢查類別
