Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблема с join и max  [new]
newbie12
Member

Откуда:
Сообщений: 12
Здравствуйте, имеется проблема, не могу составить правильный запрос
[Лицевые счета] ROW_ID int IDENTITY(1,1) NOT NULL,
                             Счета  int NOT NULL, --поле иерархии (связь на родительскую запись)
                             Номер int NULL           -- номер лицевого счета
[Показания счетчиков] ROW_ID int IDENTITY(1,1) NOT NULL,
                                        [Показания-Счет]  int NOT NULL,  -- связь на row_id Лицевых счетов
                                        Дата datetime NULL
                                        Показание float NULL

Написать запрос для извлечения последнего (с максимальной датой) показания счетчика по каждому лицевому
счету

Пробую вот так и очевидно что что то не так)
SELECT L.Номер,s.Показание  from stack.[Показания счетчиков] as S join  stack.[Лицевые счета] as L on L.ROW_ID = S.[Показания-Счет]
where S.Дата = (select  max(s.Дата) from  stack.[Показания счетчиков] where L.ROW_ID = [Показания-Счет])

подскажите как связать поля номер одной таблицы с полем показание другой через функцию max от даты?
3 фев 12, 21:30    [12030353]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
SELECT TOP(1) WITH TIES *
FROM [Лицевые счета] L JOIN [Показания счетчиков] P ON L.ROW_ID=P.[Показания-Счет]
ORDER BY ROW_NUMBER()OVER(PARTITION BY L.L.ROW_ID ORDER BY Дата DESC);
3 фев 12, 21:52    [12030445]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Пара опечаток...
SELECT TOP(1) WITH TIES *
FROM [Лицевые счета] L JOIN [Показания счетчиков] P ON L.ROW_ID=P.[Показания-Счет]
ORDER BY ROW_NUMBER()OVER(PARTITION BY L.ROW_ID ORDER BY P.Дата DESC);
3 фев 12, 21:53    [12030453]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
Guset
Guest
iap,

А более простой запрос существует? Этот громозда какая то и не походит на то что может написать новичек
3 фев 12, 21:59    [12030477]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
newbie12
Member

Откуда:
Сообщений: 12
С помощью
SELECT L.Номер,max(S.Дата) from stack.[Лицевые счета] as L join  stack.[Показания счетчиков] as S on L.ROW_ID = S.[Показания-Счет]
group by L.Номер order by L.Номер

аналогичного результата как и от запроса iap, но не могу получить именно само показание и не выводить дату.
Как быть, подскажите?
3 фев 12, 22:10    [12030549]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
Crimean
Member

Откуда:
Сообщений: 13147
from [Лицевые счета] [outer / cross] apply (top 1 from [Показания счетчиков]) ?
3 фев 12, 22:15    [12030582]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
newbie12,

newbie12 = Guset ?
3 фев 12, 22:16    [12030599]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
newbie12
Member

Откуда:
Сообщений: 12
iap,

Да, забылся)
3 фев 12, 22:17    [12030608]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
SELECT L.Номер,max(S.Дата) from stack.[Лицевые счета] as L join  stack.[Показания счетчиков] as S on L.ROW_ID = S.[Показания-Счет]
where not exists ( select * from stack.[Лицевые счета] where Номер < L.Номер )

?
3 фев 12, 22:18    [12030621]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
Crimean
from [Лицевые счета] [outer / cross] apply (top 1 from [Показания счетчиков]) ?
Дык это ж "громозда" похлеще прежней!
Подстава, короче!
3 фев 12, 22:18    [12030624]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
newbie12
Member

Откуда:
Сообщений: 12
Knyazev Alexey,

определенно нет
3 фев 12, 22:21    [12030639]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
newbie12
Member

Откуда:
Сообщений: 12
раньше я думал что SQL простой, как я ошибался.
Какова цепь размышлений о том что делает этото запрос?

очевидно тут агрегация будет иметь место быть
соответственно и group by
однако это не даст нужного поля в итоге
мой мозг расплавился
3 фев 12, 22:27    [12030682]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
newbie12
определенно нет


SELECT *
FROM ( select * from [Лицевые счета] L JOIN [Показания счетчиков] P ON L.ROW_ID=P.[Показания-Счет] ) a
where not exists 
( select * from [Лицевые счета] L JOIN [Показания счетчиков] P ON L.ROW_ID=P.[Показания-Счет] 
where L.ROW_ID = a.ROW_ID and P.Дата > a.Дата )
3 фев 12, 22:28    [12030689]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
select
 x.Номер,
 y.Дата,
 y.Показание
from
 [Лицевые счета] x join
 [Показания счетчиков] y on y.[Показания-Счет] = x.ROW_ID
where
 not exists(select * from [Показания счетчиков] where [Показания-Счет] = x.ROW_ID and Дата > y.Дата);

В чем степень громоздистости измеряем?
3 фев 12, 22:32    [12030706]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
Эээ... предыдущий мой пост не смотреть -- наврал.
3 фев 12, 22:32    [12030707]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
newbie12
Member

Откуда:
Сообщений: 12
Knyazev Alexey,

( select * from stack.[Лицевые счета] L JOIN stack.[Показания счетчиков] P ON L.ROW_ID=P.[Показания-Счет] ) a
в результирующей таблице будет два ROW_ID столбца из двух таблиц, фейл(
3 фев 12, 22:33    [12030708]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
newbie12
Member

Откуда:
Сообщений: 12
кстати, какую операцию теории множеств реализует простой запрос вроде этого:
select * from stack.[Лицевые счета] L JOIN stack.[Показания счетчиков] P ON L.ROW_ID=P.[Показания-Счет]

?
3 фев 12, 22:38    [12030725]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
newbie12
в результирующей таблице будет два ROW_ID столбца из двух таблиц, фейл(


этот вариант 12030706 смотрели?
3 фев 12, 22:43    [12030752]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
newbie12
Member

Откуда:
Сообщений: 12
Knyazev Alexey,
Не работает как надо. Результирующая таблица должна состоять из двух столбцов
3 фев 12, 23:02    [12030814]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с join и max  [new]
newbie12
Member

Откуда:
Сообщений: 12
newbie12,

Допилил, работает
select
 L.Номер,
 max(S.Показание)
from
stack.[Лицевые счета] L join
stack.[Показания счетчиков] S on S.[Показания-Счет] = L.ROW_ID

where
not exists(select * from stack.[Показания счетчиков] where [Показания-Счет] = L.ROW_ID and Дата > S.Дата)
group by L.Номер

Сам бы не додумался до
not exists(select * from stack.[Показания счетчиков] where [Показания-Счет] = L.ROW_ID and Дата > S.Дата)
, спасибо
опыта нет, что уж
3 фев 12, 23:23    [12030870]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить