Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Минимум в строке по условию / 16 сообщений из 16, страница 1 из 1
12.01.2018, 10:03
    #39583050
Евгенич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
Добрый день! Прошу помощи

Имеется таблица MS SQLSERVER 2012:
Код: sql
1.
2.
3.
4.
5.
6.
create table #table1(id int identity,repdate datetime, date1 datetime,date2 datetime,date3 datetime,date4 datetime)

insert #table1 
select '20180501','20171226','20180326','20180626','20180926'
union all
select '20180501','20170823','20171123','20180223','20180523'



Необходимо найти для каждой строки минимальную из дат date1,date2,date3,date4 большую чем repdate.

То есть для первой строки это будет значение '20180626', для второй '20180523'

Заранее благодарю за помощь!
...
Рейтинг: 0 / 0
12.01.2018, 10:09
    #39583053
Минимум в строке по условию
Евгенич,

не хватает в скульсервере таких вещей, как greatest и least... :)
а так - развернуть строку в столбец (UNPIVOT), взять минимум (MIN). при необходимости - снова развернуть в строку (PIVOT)
...
Рейтинг: 0 / 0
12.01.2018, 10:48
    #39583108
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
Евгенич,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT 
*
FROM #Table1 a
CROSS APPLY
(
	SELECT [MaxDate] = MAX([Value])
	FROM 
	(
		SELECT a.date1 as [Value]
		UNION ALL
		SELECT a.date2
		UNION ALL
		SELECT a.date3
		UNION ALL
		SELECT a.date4	
	) x
) b
...
Рейтинг: 0 / 0
12.01.2018, 10:51
    #39583120
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create table #table1(id int identity,repdate datetime, date1 datetime,date2 datetime,date3 datetime,date4 datetime)

insert #table1 
select '20180501','20171226','20180326','20180626','20180926'
union all
select '20180501','20170823','20171123','20180223','20180523'

Select a.id, Min(t.[date]) [min_date]   from
	#table1 a
	Cross apply (Values (a.date1), (a.date2), (a.date2), (a.date3)) t ([date])
Where a.repdate > t.[date]
Group by  a.id
...
Рейтинг: 0 / 0
12.01.2018, 10:59
    #39583133
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
Пардон, конечно:
Код: sql
1.
Values (a.date1), (a.date2), (a.date3), (a.date4)
...
Рейтинг: 0 / 0
12.01.2018, 11:12
    #39583145
Евгенич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
Всем спасибо! Сделал через unpivot:

Код: sql
1.
2.
3.
4.
5.
6.
7.
select  top 1 with ties id,repdate,column_name,(date_)
from #table1
unpivot(
		date_ for column_name in ([date1],[date2],[date3],[date4])
		) as test
where date_>repdate
order by ROW_NUMBER() over (partition by id order by date_ )
...
Рейтинг: 0 / 0
12.01.2018, 11:15
    #39583149
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
Евгенич,

авторСделал через unpivot:
этот день нормальным уже не будет
...
Рейтинг: 0 / 0
12.01.2018, 11:34
    #39583171
Минимум в строке по условию
TaPaK,

Так ведь сегодня же пятница, все только начинается
...
Рейтинг: 0 / 0
12.01.2018, 13:22
    #39583274
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
ЕвгеничВсем спасибо! Сделал через unpivot:

А теперь сравни планы. С моим, например.
...
Рейтинг: 0 / 0
12.01.2018, 13:57
    #39583299
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
uaggsterЕвгеничВсем спасибо! Сделал через unpivot:

А теперь сравни планы. С моим, например.
заметил, что PIVOT/UNPIVOT быстрее работают нежели аналогичный код - возможно, плацебо :)
а вот TOP WITH TIES - это, конечно, зря...
...
Рейтинг: 0 / 0
12.01.2018, 14:13
    #39583310
Евгенич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
uaggsterЕвгеничВсем спасибо! Сделал через unpivot:

А теперь сравни планы. С моим, например.


Не умею читать планы от слова ваапще. Можете тыкнуть пальцем, чем мой хуже вашего?
Скрин приложил.
...
Рейтинг: 0 / 0
12.01.2018, 14:34
    #39583323
Massa52
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
Евгенич,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table #table1(id int identity,repdate datetime, date1 datetime,date2 datetime,date3 datetime,date4 datetime)

insert #table1 
select '20180501','20171226','20180326','20180626','20180926'
union all
select '20180501','20170823','20171123','20180223','20180523'

Select id, repdate
   ,CASE   
         WHEN date1 < date2 AND date1 < date3 AND date1 < date4 THEN date1  
         WHEN date2 < date3 AND date2 < date4 THEN date2  
         WHEN date3 < date4 THEN date3  
         ELSE date4  
    END minDate  

from #table1 
...
Рейтинг: 0 / 0
12.01.2018, 14:38
    #39583329
x_sql_x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
Евгенич,

Код: sql
1.
2.
select id, ( select min (dt) from (values (date1), (date2), (date3), (date4)) t (dt) where dt > repdate ) as min_date
from #table1
...
Рейтинг: 0 / 0
12.01.2018, 16:27
    #39583386
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
Евгеничuaggsterпропущено...

А теперь сравни планы. С моим, например.


Не умею читать планы от слова ваапще. Можете тыкнуть пальцем, чем мой хуже вашего?
Скрин приложил.
Как минимум дополнительная сортировка и сиквенс
...
Рейтинг: 0 / 0
12.01.2018, 19:06
    #39583485
Massa52
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
Евгенич,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
create table #table1(id int identity,repdate datetime, date1 datetime,date2 datetime,date3 datetime,date4 datetime)

insert #table1 
select '20180501','20171226','20180326','20180626','20180926'
union all
select '20180501','20170823','20171123','20180223','20180523';

DECLARE @maxDate DATE = '20990101';  -- любая заоблачная дата
;WITH c AS -- отсекаем даты <= repdate
(
  Select id, repdate
   ,CASE WHEN date1 <= repdate THEN @maxDate ELSE date1 END date1  
   ,CASE WHEN date2 <= repdate THEN @maxDate ELSE date2 END date2  
   ,CASE WHEN date3 <= repdate THEN @maxDate ELSE date3 END date3  
   ,CASE WHEN date4 <= repdate THEN @maxDate ELSE date4 END date4  
  from #table1 
)
Select id, repdate
   ,CASE   
         WHEN date1 < date2 AND date1 < date3 AND date1 < date4 THEN date1  
         WHEN date2 < date3 AND date2 < date4 THEN date2  
         WHEN date3 < date4 THEN date3  
         ELSE date4  
    END minDate  

from c 
...
Рейтинг: 0 / 0
15.01.2018, 16:08
    #39584546
Евгенич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Минимум в строке по условию
Всем спасибо!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Минимум в строке по условию / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]