我有一張這樣的桌子
| id | state | updatedate |
|:--------|:---------------|:------------|
| 1 | state_review | 1668603529 |
| 1 | state_review | 1668601821 |
| 1 | state_review_2 | 1668601821 |
| 2 | state_review | 1668601709 |
| 2 | state_review | 1668600822 |
| 2 | state_review_2 | 1668600747 |
| 3 | state_review | 1668559849 |
| 3 | state_review_2 | 1668539849 |
| 3 | state_review | 1668529849 |
| 3 | state_review_2 | 1661599849 |
| 3 | state_review | 1668599849 |
我試圖找到如何根據提供的值計算所有 id 的狀態更改的第一次出現,我有兩個傳入狀態從(state_review)到(state_review_2)
在這種特殊情況下,只有三個更改的狀態從 state_review -> state_review_2
結果表看起來像這樣
| amount |
|:--------|
| 3 |
我懷疑視窗函式可能對此有所幫助,但我不確定如何將當前狀態與所有其他狀態進行比較,狀態必須按 id 排序
試圖使用此查詢,但這似乎不起作用,而不是計算最新的唯一轉換,而是計算所有這些轉換,如果第一個找到的轉換與給定狀態不匹配,則跳過特定 ID 的整個部分
SELECT
COUNT(DISTINCT (
CASE
WHEN
(
q.state = 'state_review'
AND 'state_review' != 'state_review_2'
)
THEN
ID
END
)) AS amount
FROM
(
SELECT
id,
state
FROM
states_table
WHERE
updatedate >= 1668603529
AND updatedate <= 1671599849
AND
(
state = 'state_review'
OR state = 'state_review_2'
)
ORDER BY
id, updatedate DESC
)
AS q
uj5u.com熱心網友回復:
可以使用 LAG 函式獲得 2 個預定義狀態之間的轉換。state_review和的例子state_review_2
SELECT *
FROM(
SELECT ID, LAG(State) OVER (PARTITION BY ID ORDER BY updatedate) As FromState, State, updatedate
FROM States_table
) T
WHERE FromState = 'state_review' AND state = 'state_review2'
您可以執行上述操作的變體:
- 當一個 id 多次從狀態 S1 轉換到狀態 S2 時,為了避免重復計數,請像這樣更改子查詢 with
DISTINCT和 withoutupdatedate:SELECT DISTINCT ID, LAG(State) OVER (PARTITION BY ID ORDER BY updatedate) As FromState, State - 當然,
SELECT COUNT(*)如果你想要的只是計數,那就去做吧。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/535280.html
下一篇:帶計數聚合的SQL查詢
