[英]Translate MySQL join into SQL Server syntax?
在MySQL中,我曾經能夠執行以下操作:
SELECT Something1.ID, Something2.AverageValue FROM
(SELECT ID, Max(Date) FROM Table GROUP BY ID) Something1
LEFT JOIN
(SELECT ID, AverageValue FROM Table) Something2
ON Something1.ID = Something2.ID
所以我想做的就是給我每個ID的最新平均值
SQL Server中的語法似乎有所不同,並且不允許我執行嵌套的SELECT語句嗎?
WITH Data AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) AS Row_Number,
ID,
AverageValue
FROM Table
)
SELECT * FROM Data WHERE Row_Number = 1
這是您應該在SQL Server中執行的方法。 它使“最后/第一/最大/最小/最大n組”變得容易。
PARTITION BY
關鍵字在這里等於您的GROUP BY
語句,此處的ORDER BY
將轉換為您在MySQL中使用的MAX
聚合函數
使用它可以使您做一些花哨的事情,例如:
WITH Data AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) AS Row_Number,
ID,
AverageValue
FROM Table
)
SELECT Newest.ID,
Newest.AverageValue,
(Newest.AverageValue - Next_Newest.AverageValue) AS AverageValue_Change,
Newest.Date
FROM Data Newest
LEFT OUTER JOIN Data Next_Newest
ON Newest.Row_Number+1 = Next_Newest.Row_Number
AND Newest.ID = Next_Newest.ID
WHERE Newest.Row_Number=1
是的,有這個查詢在SQL Server中的一個問題,因為您的評論有助於看到。
對於將列表示為表達式而不帶別名,MySQL似乎很好。 在SQL Server中,這是“不能做的”。 如果SELECT
子句中的列是表達式,則必須為其提供別名。 因此:
SELECT Something1.ID, Something2.AverageValue FROM
(SELECT ID, Max(Date) AS MaxDate FROM Table GROUP BY ID) Something1
LEFT JOIN
(SELECT ID, AverageValue FROM Table) Something2
ON Something1.ID = Something2.ID
由於您沒有在主SELECT中提取MaxDate
列,因此也可以忽略它。 無論如何,在這種特殊情況下,這似乎是兩種產品之間的唯一區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.