T-Sql
根據一列的最新值從多列中選擇值
我有一個 Azure Cosmos DB,其中包含 DateTime、userName、temperature 和 bloodPressure 列以及許多其他列。有幾個不同的 userName 值,每個 userName 都有在不同的 DateTime 值處收集的溫度和血壓數據。這 15 次中的每一次的溫度和血壓值都不同。
這是數據的範例,
userName, DateTime, bloodPressure, temperature, heartBeat, hatSize Curly, "2021-01-19 18:24:53", 121, 98, 60, 7.25 Larry, "2021-01-14 18:24:53", 125, 99, 80, 7.5 Mo, "2021-01-13 18:24:53", 123, 100, 70, 7.75 Curly, "2021-01-18 18:24:53", 120, 97, 50, 8 Larry, "2021-01-13 18:24:53", 119, 99, 75, 7.15 Larry, "2021-01-15 18:24:53", 115, 98, 85, 7.37 Mo, "2021-01-12 18:24:53", 110, 102, 100, 8.01 Mo, "2021-01-20 18:24:53", 130, 99, 110, 6.97 Larry, "2021-01-18 18:24:53", 127, 98, 72, 7.76 Curly, "2021-01-17 18:24:53", 126, 97, 82, 8.0
對於每個使用者,我想返回他們最新測量的日期時間,以及他們最新日期時間的溫度和血壓:
Larry, "2021-01-18 18:24:53", 127, 98 Mo, "2021-01-20 18:24:53", 130, 99 Curly, "2021-01-19 18:24:53", 121, 98
我試過這個,
SELECT c.userName, MAX(c.DateTime), c.bloodPressure, c.temperature FROM CheckupData c GROUP BY c.userName
但得到一個錯誤,即 GROUP BY 應該包括 SELECT 的其他輸出。由於血壓和溫度總是在變化,看來我不應該在 GROUP BY 中使用它們,因為我只想要最新的值。我究竟做錯了什麼?(如果重要的話,我的真實數據庫更大:50,000 個使用者名,每個使用者名以 50 個左右的 DateTime 值和 30 個左右的列測量)。
我沒有可以測試的環境,但以下內容可能對您有用。
編輯:我現在看到這與@Verace 的評論相同,但它仍然應該在 Cosmos DB 中工作。
https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-subquery
SELECT c.userName , c.DateTime , c.bloodPressure , c.temperature FROM CheckupData c JOIN (SELECT g.userName, MAX(g.DateTime) AS MaxDateTime FROM CheckupData g GROUP BY g.userName) m WHERE m.userName = c.userName AND m.MaxDateTime = c.DateTime
a 中的每一列
SELECT
都必須在GROUP BY
或使用聚合函式SELECT c.userName, MAX(c.DateTime), c.bloodPressure, c.temperature FROM CheckupData c GROUP BY c.userName,c.bloodPressure, c.temperature
或者
SELECT c.userName, MAX(c.DateTime), AVG(c.bloodPressure), AVG(c.temperature) FROM CheckupData c GROUP BY c.userName
因為我們對您的數據和期望的結果一無所知。您必須選擇所需的值。
對於大桌子,您可以使用
CREATE TABLE CheckupData ([userName] varchar(5), [DateTime] varchar(21), [bloodPressure] int, [temperature] int, [heartBeat] int, [hatSize] int) ; INSERT INTO CheckupData ([userName], [DateTime], [bloodPressure], [temperature], [heartBeat], [hatSize]) VALUES ('Curly', '"2021-01-19 18:24:53"', 121, 98, 60, 7.25), ('Larry', '"2021-01-14 18:24:53"', 125, 99, 80, 7.5), ('Mo', '"2021-01-13 18:24:53"', 123, 100, 70, 7.75), ('Curly', '"2021-01-18 18:24:53"', 120, 97, 50, 8), ('Larry', '"2021-01-13 18:24:53"', 119, 99, 75, 7.15), ('Larry', '"2021-01-15 18:24:53"', 115, 98, 85, 7.37), ('Mo', '"2021-01-12 18:24:53"', 110, 102, 100, 8.01), ('Mo', '"2021-01-20 18:24:53"', 130, 99, 110, 6.97), ('Larry', '"2021-01-18 18:24:53"', 127, 98, 72, 7.76), ('Curly', '"2021-01-17 18:24:53"', 126, 97, 82, 8.0) ;
GO
SELECT cd.[userName], cd.[DateTime], cd.[bloodPressure], cd.[temperature], cd.[heartBeat], cd.[hatSize] FROM CheckupData cd INNER JOIN (SELECT MAX([DateTime]) lastdate,[userName] FROM CheckupData GROUP BY [userName]) cd1 ON cd.[userName] = cd1.[userName] AND cd.[DateTime] = cd1.lastdate GO
使用者名 | 日期時間 | 血壓 | 溫度 | 心跳 | 帽子尺寸 :------- | :-------------------- | ------------: | ----------: | --------: | ------: 莫 | "2021-01-20 18:24:53" | 130 | 99 | 110 | 6 拉里 | "2021-01-18 18:24:53" | 127 | 98 | 72 | 7 捲曲 | "2021-01-19 18:24:53" | 121 | 98 | 60 | 7
db<>在這裡擺弄