Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как переписать следующий запрос.  [new]
Мимоходящий
Guest
SELECT T1.pole1, T1.date1,
(SELECT TOP 1 T2.pole2 FROM TABLE2 T2 WHERE T2.date2 <= T1.date1 ORDER BY T2.date2 DESC)
FROM TABLE1 T1

Как переписать данный запрос без подзапроса, чтобы можно было агрегировать результат подзапроса.
28 апр 14, 14:13    [15946620]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
lag()
28 апр 14, 14:25    [15946713]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
Мимоходящий
Guest
Коррелирующий подзапрос не пройдет ?

LAG() в 2012 только.
Хотя реализация с LAG тоже интересна.
28 апр 14, 14:31    [15946754]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Knyazev Alexey
lag()
А не LAST_VALUE()?
28 апр 14, 14:37    [15946810]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Может, так?
SELECT TOP(1) WITH TIES T1.pole1, T1.date1, T2.pole2
FROM TABLE1 T1
LEFT JOIN TABLE2 T2 ON T2.date2 <= T1.date1
ORDER BY ROW_NUMBER()OVER(PARTITION BY T1.pole1, T1.date1 ORDER BY T2.date2 DESC);
28 апр 14, 14:42    [15946842]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Мимоходящий
Коррелирующий подзапрос не пройдет ?
outer apply
28 апр 14, 14:46    [15946875]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
invm
outer apply
Мимоходящий
без подзапроса
28 апр 14, 15:04    [15947020]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
iap
Мимоходящий
без подзапроса
Мимоходящий
без подзапроса, чтобы можно было агрегировать результат подзапроса.
28 апр 14, 15:06    [15947036]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
invm
iap
пропущено...
Мимоходящий
без подзапроса, чтобы можно было агрегировать результат подзапроса.
А чего ж он тогда агрегировать собрался?
28 апр 14, 15:10    [15947073]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
Мимоходящий
Guest
Я прошу прощения, думаю я что то перемудрил. Итак подробнее чего я хочу.

DECLARE @T TABLE(DT DATETIME,KURS MONEY)

INSERT INTO @T(DT, KURS) VALUES ('20140401',10)
INSERT INTO @T(DT, KURS) VALUES ('20140402',9)
INSERT INTO @T(DT, KURS) VALUES ('20140405',8)


DECLARE @SALES TABLE(DT DATETIME,S MONEY)

INSERT INTO @SALES (DT, S) VALUES ('20140401',1000)
INSERT INTO @SALES (DT, S) VALUES ('20140402',2000)
INSERT INTO @SALES (DT, S) VALUES ('20140403',3000)
INSERT INTO @SALES (DT, S) VALUES ('20140404',4000)
INSERT INTO @SALES (DT, S) VALUES ('20140405',5000)


SELECT *,
( SELECT TOP 1 KURS FROM @T T WHERE T.DT <= S.DT ORDER BY T.DT DESC ) KURS
FROM @SALES S



Мало того что подзапрос мягко говоря не очень хорошо, так еще не могу сделать следующее.


SELECT DT,
SUM ( ( SELECT TOP 1 KURS FROM @T T WHERE T.DT <= S.DT ORDER BY T.DT DESC ) * S )  
FROM @SALES S
GROUP BY DT


Говорит

Msg 130, Level 15, State 1, Line 17
Cannot perform an aggregate function on an expression containing an aggregate or a subquery.
28 апр 14, 15:14    [15947107]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
Мимоходящий
Guest
Вроде бы разобрался.
Так верно ?

SELECT DT, SUM(S*SQ.KURS)
FROM @SALES S OUTER APPLY (SELECT TOP 1 KURS FROM @T T WHERE T.DT <= S.DT ORDER BY T.DT DESC) SQ
GROUP BY DT
28 апр 14, 15:22    [15947142]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Мимоходящий
Вроде бы разобрался.
Так верно ?

SELECT DT, SUM(S*SQ.KURS)
FROM @SALES S OUTER APPLY (SELECT TOP 1 KURS FROM @T T WHERE T.DT <= S.DT ORDER BY T.DT DESC) SQ
GROUP BY DT


а зачем тут вообще SUM/GROUP BY ?
28 апр 14, 15:23    [15947150]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
Мимоходящий
Guest
Даты могут повторяться.
28 апр 14, 15:26    [15947174]     Ответить | Цитировать Сообщить модератору
 Re: Как переписать следующий запрос.  [new]
vartAG
Member

Откуда:
Сообщений: 17
select s.DT, sum(S * T.KURS)
from @SALES S
left join @T T on T.DT <= S.DT
and not exists(select 1 from @T t800 where t800.DT > T.DT and t800.DT <= S.DT)
group by s.DT

можно еще таким способом, даже быстрее на тестовых данных отрабатывает, нежели outer apply
7 май 14, 15:28    [15986147]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить