Select
SQL select question with group by and order
所以我在 SQLite 中處理這個相當簡單的任務。我有這張帶列的表
主機名,KB,狀態
所以每一行都是在伺服器上安裝/未安裝的 KB(根據 WSUS)。
每台伺服器都有幾百行,具體取決於它的年齡和作業系統版本。我只想查看處於“已安裝”狀態的每台伺服器的最新(最高 kb 編號)。
不幸的是,這個查詢似乎不起作用,並顯示了一些隨機的 kb,絕對不是最高的:
Select hostname, kb FROM patchstate WHERE state='installed' GROUP BY hostname ORDER BY kb DESC
使用SQLLite Max 函式和 Alias 將允許您將查詢重寫為
SELECT hostname, MAX(kb) AS LastKB FROM patchstate GROUP BY hostname ORDER BY LastKB DESC;
這應該提供您正在尋找的結果。
大多數 DBMS在看到這個查詢時都會拋出錯誤。
Oracle、SQLServer、PostgreSQL 甚至 MySQL,如果配置正確的話。
為什麼?正是你所說的原因。
您已要求查詢為每個hostname返回一行,但還選擇了列kb。您還沒有告訴 DBMS 如何根據主機名的“鍵”得出kb 的值,所以它只是將任何舊值交給您,只要“鍵”發生變化,它就會碰巧遇到。
您在聚合查詢中選擇的每個欄位**都必須位於“group by”子句中或包裝在聚合函式中(在這種情況下,您需要max() )。