2012-01-05 6 views
0

В MySQL я использовал, чтобы быть в состоянии сделать что-то вроде:Перевести MySQL присоединиться к синтаксису SQL Server?

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 

Так что я пытаюсь сделать, это дать мне самую последнюю averagevalue, за ID

Синтаксис в SQL Server, как представляется, разные и не позволяет мне делать вложенные операторы SELECT?

+1

У вас есть дополнительная скобка перед 'ID', я думаю ... –

+0

Спасибо, но я полагаю, что это не значит, что я могу сделать выше в SQL Server? Мне показалось, что весь синтаксис для вложенных объединений отличается? – mezamorphic

+0

@ user1107474: Почему бы просто не попробовать? Он должен работать отлично. –

ответ

2
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. Он делает «last/first/max/min/great-n-per group» легким, как пирог.

PARTITION BY ключевое слово здесь составляет ваше GROUP BY заявление, и ORDER BY здесь будет переводить в агрегатной функции MAX вы использовали в MySQL

Используя это позволит вам сделать некоторые модные вещи, как:

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 
+1

Не обязательно * должен *, но * может *, да. Тем не менее, мне кажется больше вопрос о том, можете ли вы присоединиться к подобным подзапросам или нет. –

+0

Вы можете, но зачем это так? :) – cairnz

+1

+1 за то, что он призвал OP к lo ok для альтернативных подходов, а не для перевода. Чтобы использовать аналогию, а не выполнять перевод английских слов «Принесите домой бекон» на французский язык, нужно искать эквивалентную идиому, например. «Faire bouillir la marmite» («Держите кипячение горшка») ... или попросите обоих говорить на эсперанто (стандартный SQL);) – onedaywhen

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 

Поскольку вы не тянете MaxDate колонки в главной SELECT, вы также можете просто опустить. Во всяком случае, это единственная разница между двумя продуктами в данном конкретном случае.

Смежные вопросы