Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка значения с максимальной датой 
:(
    Опции темы
Cashey
Дата 18.8.2015, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Условие:
Есть таблица, имеет, допустим, три поля:
1. kod - неуникальный идентификатор
2. reason - некое значение
3. dstop - дата, связанная с основным значением
пример:
          kod                            reason          dstop
5068070838000124                1             2013-01-01
5068070838000124                5             2014-02-02
5068070838000124                3             2015-03-03

требуется вытащить только значение поля reason из строки с максимальным значением поля dstop

Я родил такую конструкцию:
Код
SELECT t2.[reason] 
      ,t2.kod 
      ,t2.dstop 
  FROM [REGISTR].[dbo].[S_file] 
  left join (select max(dstop) as ds, kod from [REGISTR].[dbo].[S_file] group by kod)  t1 on S_file.kod = t1.kod
   left join [REGISTR].[dbo].[S_file] t2 on t2.kod = t1.kod and t2.dstop = t1.ds
   where S_file.kod ='5068070838000124' group by t2.[reason], t2.kod, t2.dstop 


Функционально работает, но выглядет как извращение. Задача тривиальная, думаю кому-то уже хватило мозгов создать что-то более рациональное. Спасибо за подсказку.



--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Akina
Дата 19.8.2015, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Цитата(Cashey @  18.8.2015,  21:11 Найти цитируемый пост)
требуется вытащить только значение поля reason из строки с максимальным значением поля dstop

Код

SELECT TOP 1 reason
FROM [REGISTR].[dbo].[S_file]
WHERE kod ='5068070838000124'
ORDER BY dstop DESC



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Cashey
Дата 19.8.2015, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(Akina @ 19.8.2015,  09:59)
Код

SELECT TOP 1 reason
FROM [REGISTR].[dbo].[S_file]
WHERE kod ='5068070838000124'
ORDER BY dstop DESC

Элегантно, но не применимо. Приведенный в примере where S_file.kod ='5068070838000124' лишь частный случай. В общем случае в этом месте предполагается множество. И конструкция может быть where S_file.kod in (...). В этом случае SELECT TOP 1 не работоспособно.


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Akina
Дата 19.8.2015, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Cashey,  значит, сперва обдумайте свой вопрос полностью, а потом спрашивайте.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ТоляМБА
Дата 19.8.2015, 21:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: нет
Всего: 252



Код
select S.kod, S.reason, S.dstop
from S_file as S
inner join (
select kod, max(dstop) as A
from S_file
group by kod) as B
on S.kod = B.kod and S.dstop = B.A
where S.kod in ('5068070838000124', '5068070838000125')
order by 1


Это сообщение отредактировал(а) ТоляМБА - 19.8.2015, 21:04
PM   Вверх
Akina
Дата 20.8.2015, 09:22 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



ТоляМБА, я бы рекомендовал фильтр по коду убрать в подзапрос.

Cashey, если версия сервера знает про оконные функции - лучше используй DENSE_RANK() OVER (PARTITION BY kod ORDER BY dstop DESC)


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ТоляМБА
Дата 20.8.2015, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: нет
Всего: 252



Akina, согласен.

Код
select S.kod, S.reason, S.dstop
from S_file as S
inner join (
select kod, max(dstop) as A
from S_file
where kod in ('5068070838000124', '5068070838000125')
group by kod) as B
on S.kod = B.kod and S.dstop = B.A
order by 1

PM   Вверх
Cashey
Дата 20.8.2015, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(ТоляМБА @ 19.8.2015,  22:02)
Код
select S.kod, S.reason, S.dstop
from S_file as S
inner join (
select kod, max(dstop) as A
from S_file
group by kod) as B
on S.kod = B.kod and S.dstop = B.A
where S.kod in ('5068070838000124', '5068070838000125')
order by 1

Глупо как, я не догодался в выражение ON первого JOIN вставить второе условие, тянув для этого второй JOIN. Но в целом идея та же.


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.