Select

SQL select question with group by and order

  • December 2, 2020

所以我在 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() )。

引用自:https://dba.stackexchange.com/questions/280689