我有一個列中有10個里程碑的列表milestone
。列milestone_achieved
具有值OK
或NULL
。 name
列只有名稱,每當有人進入時,所有里程碑都將輸入到NULL
的數據庫中。使用列的最大值,如果空使用分鐘
下面是一個典型的表如下所示:
+------+-----------+--------------------+
| name | milestone | milestone_achieved |
+------+-----------+--------------------+
| John | 1 | OK |
| John | 2 | OK |
| John | 3 | NULL |
| John | 4 | NULL |
| John | 5 | NULL |
| John | 6 | NULL |
| Mary | 1 | OK |
| Mary | 2 | OK |
| Mary | 3 | OK |
| Mary | 4 | OK |
| Mary | 5 | OK |
| Mary | 6 | OK |
| Tim | 1 | NULL |
| Tim | 2 | NULL |
| Tim | 3 | NULL |
| Tim | 4 | NULL |
| Tim | 5 | NULL |
| Tim | 6 | NULL |
+------+-----------+--------------------+
現在我想的SQL查詢返回:
+------+-----------+--------------------+
| name | milestone | milestone_achieved |
+------+-----------+--------------------+
| John | 2 | OK |
| Mary | 6 | OK |
| Tim | 1 | NULL |
+------+-----------+--------------------+
我的查詢現在看起來是這樣的:
SELECT name, MAX(milestone) FROM table HAVING milestone_achieved = 'OK' GROUP BY name
UNION ALL
SELECT name, MIN(milestone) FROM table HAVING milestone_achieved IS NULL AND MIN(milestone) = 1 GROUP BY name
這適用於90%的情況,當例如發生問題時里程碑1和2已經完成,但是里程碑1因爲不符合特定標準或其他因素而未完成(想象一下組裝線,其中汽車組裝在一起並且螺釘=milestone 1
不夠緊密,但油漆=milestone 2
已經存在或者你可以想象的其他任何東西,我都有可怕的想象力)。
我現在正在尋找一種方法來正確顯示這些10%的情況。
您的異常情況的預期輸出是多少? –
我不確定你的查詢是否有效。 [HAVING](https://msdn.microsoft.com/en-GB/library/ms180199.aspx)子句可以過濾[聚合函數]的結果(https://msdn.microsoft.com/zh-CN/zh-cn/庫/ ms173454.aspx)(SUM,MIN,MAX等)。它需要與GROUP BY子句結合使用。 [WHERE](https://msdn.microsoft.com/en-gb/library/ms188047.aspx)允許您在行級進行過濾。除了挑選外,你的方法是正確的。 Gordon Linoff在下面的答案糾正了這些錯誤。 –
實際異常情況的輸出將是(如果我們假設Tim已經取消了他的'里程碑1'成就:'John,2,OK','Mary,6,OK','Tim,2,OK','Tim ,1,NULL'。 我實際上希望'Tim,1,NULL'從結果中消失,解決方案在@Gordon Linoff的答案中。 – Spurious