對於我來說這個場景很難解釋,但我想要獲得準備進行解僱會議的用戶列表(實際上是「患者」)。根據記錄的條目查找用戶列表
局勢
我有一個病人表:
PATIENT
id (int)
name (varchar)
患者遵循特殊的工藝,在那裏我有明確的階段:
PHASE
id (int)
name (varchar)
我記錄所有的病人階段:
STATUS
id (int)
phase_id (int)
patient_id (int)
timestamp (datetime)
術語「準備開會」表示會議正在計劃中。這樣的計劃會議記錄在消息表中。計劃會議的消息具有「meeting_planned」類型,例如會議完成時,會有一個新消息「meeting_done」。
MESSAGE
id (int)
patient_id (int)
type (enum)
value (varchar)
timestamp (datetime)
我的查詢
我要尋找一個查詢現在,我真的不能拿出。我的邏輯是:
- 選擇所有患者;
- 其中上次狀態(基於時間戳)來自階段名稱「C」或「D」;
- 哪裏有否消息與類型 meeting_planned。
廣告2:患者可以在兩個階段之一。當患者處於A,B,E或F階段時,不能計劃會議。當患者處於C階段時,護士可能已經決定已經開始計劃會議,但是如果沒有發生,它將在階段D發生(D始終在C之後,它是A> B> C> D> E> F)。
廣告3:可能有其他消息,但從來沒有這種類型。在+ patient_id上有一個獨特的常量。如果會議已計劃併發生,則有兩條消息(類型1 = meeting_planned,類型2 = meeting_done)。如果沒有計劃會議,則不會發生meeting_planned類型,但可能已經設置了其他消息。
有什麼我試圖
我來到了現在這個查詢:
我的問題
在上面查詢我有兩件事情我不能管理:
- I h大夫在名單上翻了一番。任何階段D的患者也會出現C期患者(如此雙重)。我嘗試了
SELECT DISTINCT
但沒有制定出 - 我現在是基於他們的名字排除階段,但我想從狀態上的時間戳訂購階段,只能看最後的狀態從那裏
廣告1:現在看起來是這樣的:
ID NAME PHASE
1 John C
2 Jane C
3 Tom C
4 Pete C
5 Anna C
1 John D
2 Jane D
3 Tom D
而且很明顯,我想這樣的:
ID NAME PHASE
4 Pete C
5 Anna C
1 John D
2 Jane D
3 Tom D
我現在我不能使用GROUP BY
在這裏,因爲我然後必須使用COUNT
或類似的分組功能。
有沒有任何SQL大師在這裏幫助我?
謝謝,你幫我解決了我的問題的第一部分。那確實解決了!有了更多的測試數據,似乎我的AND(ph.name!='E')'不會取消已經處於階段「E」的用戶(因爲他們的狀態日誌仍然顯示它們已經處於「C」和「D」。我現在選擇的患者太多了,但我認爲我可以用子查詢來管理... –
@JurianSluiman我編輯了答案。 –
謝謝,我自己也想出了這個子查詢。 ,這是一個快速反應! –