[MS SQL] взять наиболее позднюю дату из списка
От: Neco  
Дата: 30.03.16 10:54
Оценка:
Тупой вопрос — как будто знал, но забыл. И не гуглится.
Есть несколько таблиц в джоине, в каждой таблице есть колонка LastModifiedDate.
В результирующем селекте надо выбрать из каждой таблицы нужные поля и для каждой строки взять наиболее позднюю дату изменения.
что-то вроде:
select t1.id, t1.name, t2.id, t2.name, latest(t1.last_modified_date, t2.last_modified_date) as last_modified_date
from tbl1 as t1
inner join tbl2 as t2 on t1.id=t2.t2_id


что за функцию надо заюзать вместо latest?
всю ночь не ем, весь день не сплю — устаю
Re: [MS SQL] взять наиболее позднюю дату из списка
От: Olaf Россия  
Дата: 30.03.16 11:32
Оценка: 4 (1)
Здравствуйте, Neco, Вы писали:

N>Тупой вопрос — как будто знал, но забыл. И не гуглится.

N>Есть несколько таблиц в джоине, в каждой таблице есть колонка LastModifiedDate.
N>В результирующем селекте надо выбрать из каждой таблицы нужные поля и для каждой строки взять наиболее позднюю дату изменения.
N>что-то вроде:
N>
N>select t1.id, t1.name, t2.id, t2.name, latest(t1.last_modified_date, t2.last_modified_date) as last_modified_date
N>from tbl1 as t1
N>inner join tbl2 as t2 on t1.id=t2.t2_id
N>


N>что за функцию надо заюзать вместо latest?


Фактически как я понимаю вам нужно взять максимальную дату из двух колонок для каждой записи. Готового функционала нет, но можно реализовать свой метод. Например:

-- Для 2005+
select t1.id, case when t1.data > t2.data then t1.data else t2.data end as data
from tbl1 as t1
join tbl2 as t2 on t1.id = t2.id 

-- Для 2008+
select t1.id, (select max(data) from (values(t1.data), (t2.data)) as tt(data))
from tbl1 t1
join tbl2 t2 on t1.id = t2.id

-- Для 2012+ (по факту аналог case)
select t1.id, iif(t1.data > t2.data, t1.data, t2.data) data
from tbl1 as t1
join tbl2 as t2 on t1.id = t2.id

И конечно при сравнении необходимо добавить обработку null значений.
Re: [MS SQL] взять наиболее позднюю дату из списка
От: Olaf Россия  
Дата: 30.03.16 11:51
Оценка:
Здравствуйте, Neco, Вы писали:

N>....


N>что за функцию надо заюзать вместо latest?


Еще есть вариант с UNION ALL:
-- Для 2005+
select t1.id, (select max(data) from (select t1.data union all select t2.data) as tt(data))
from tbl1 t1
join tbl2 t2 on t1.id = t2.id

С использованием UNPIVOT, но не для всех задач:
-- Для 2005+
select id, max(data)
from
(
    select t1.id, t1.data as data1, t2.data as data2
    from tbl1 t1
    join tbl2 t2 on t1.id = t2.id
) a
unpivot (data for val in (data1, data2)) as upvt
group by id
Re[2]: [MS SQL] взять наиболее позднюю дату из списка
От: Neco  
Дата: 30.03.16 12:10
Оценка:
ох-ох-ох, у меня там таблиц десять по факту джойнятся — iif вообще не вариант.
с union даже получше будет.
Спасибо!
всю ночь не ем, весь день не сплю — устаю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.