[英]Very complicated SQL query
我正在使用 MySql 並應該創建一個非常復雜的報告來顯示事件狀態。
例如:
event_id | state | create_time
----------------------------------------------------
1 | PENDING | 2019-04-21 12:55:59.312
1 | COMPLETED | 2019-04-21 12:55:59.339
2 | PENDING | 2019-04-21 11:40:21.699
3 | PENDING | 2019-04-21 11:40:21.699
3 | FAILED | 2019-04-21 11:40:21.600
3 | COMPLETED | 2019-04-21 11:40:21.578
我需要根據州偏好選擇行:
這應該使用 OFFSET 和 SIZE 進行分頁。
每個事件將顯示一次。
預期結果:
event_id | state | create_time
----------------------------------------------------
1 | COMPLETED | 2019-04-21 12:55:59.339
2 | PENDING | 2019-04-21 11:40:21.699
3 | FAILED | 2019-04-21 11:40:21.600
如何在單個 SQL 查詢中執行此操作。
問候,伊多
我懷疑您想要使用一些條件邏輯進行聚合,如下所示:
select event_id,
(case when sum(state = 'FAILED') > 0 then 'FAILED'
when sum(state = 'COMPLETED') > 0 then 'COMPLETED'
when sum(state = 'PENDING') > 0 then 'PENDING'
end) as new_state
from t
group by event_id;
您可以使用coalesce()
進行聚合:
select event_id,
coalesce(max(case when state = 'FAILED' then 'FAILED' end),
max(case when state = 'COMPLETED' then 'COMPLETED' end),
'PENDING'
)
from table t
group by event_id;
另一種選擇是將這些狀態首選項作為位掩碼處理。
注意此方法假定 event_id 沒有重復的統計信息。
詢問
SELECT
t.*
FROM (
SELECT
t.event_id
, SUM(bitmask_table.bitmask) AS total_bitmask
FROM (
SELECT
DISTINCT
state
, CASE
WHEN state = 'PENDING'
THEN 2
WHEN state = 'COMPLETED'
THEN 4
WHEN state = 'FAILED'
THEN 8
END AS bitmask
FROM
t
) AS bitmask_table
INNER JOIN
t
ON
t.state = bitmask_table.state
GROUP BY
t.event_id
) AS group_bitmasked
INNER JOIN
t
ON
group_bitmasked.event_id = t.event_id
AND
t.state = CASE
WHEN group_bitmasked.total_bitmask & 8 AND group_bitmasked.total_bitmask & 4 AND group_bitmasked.total_bitmask & 2
THEN 'FAILED'
WHEN group_bitmasked.total_bitmask & 4 AND group_bitmasked.total_bitmask & 2
THEN 'COMPLETED'
WHEN group_bitmasked.total_bitmask & 2
THEN 'PENDING'
END
結果
| event_id | state | create_time |
| -------- | --------- | ----------------------- |
| 1 | COMPLETED | 2019-04-21 12:55:59.339 |
| 2 | PENDING | 2019-04-21 11:40:21.699 |
| 3 | FAILED | 2019-04-21 11:40:21.600 |
看演示
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.