T-Sql

根據一列的最新值從多列中選擇值

  • April 9, 2021

我有一個 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<>在這裡擺弄

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