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

Откуда:
Сообщений: 505
Добрый день, коллеги!

Внезапно стало нужно запилить вьюху.

Внизу я сделал скрин с данными из таблицы и что нужно получить на выходе.

Словами опишу условия:

1. в таблице хранятся данные запусков процесса
[RunID] - это ID запуска (identity)
[RunDT] - дата и время запуска.

2. в каждом месяце может быть разное количество запусков процесса,
- НО важным (production) считается запуск 25го числа каждого месяца
- если 25го числа были сделаны несколько запусков, то production-запуск - это самый последний (с max(RunID))
- если 25го числа НЕ было запусков, то то production-запуск - это самый ближайший к 25му числу запуск

Таким образом:
- в каждом месяце должен быть отобран ТОЛЬКО 1 запуск наиболее близкий к 25му числу


Поясняю скрин:
- в 10м месяце было 4 запуска и под условие production-запуска попадает один - №951 (последний 25го числа)
- в 11м месяце было 2 запуска и под условие production-запуска там легко попадает только один - №990 (единственный 25го числа)
- в 12м месяце было 2 запуска и тут с production-запуском уже не так и легко, а должен быть - №1026 (26е число)


К сообщению приложен файл. Размер - 30Kb
10 янв 19, 14:38    [21781683]     Ответить | Цитировать Сообщить модератору
 Re: Нужна view с довольно сложным условием  [new]
aleks222
Member

Откуда:
Сообщений: 698
Печально я гляжу на ваше поколенье...

1. "если 25го числа НЕ было запусков, то то production-запуск - это самый ближайший к 25му числу запуск"
С какой стороны?
Учись, страдалец, излагать мысли внятно.

2. Ну какие тут проблемы?

with s as ( select * from Source )
    ,  m as ( select distinct [25-e] = dateadd( day, 25 - datepart( day, [RunDT]),  [RunDT] ) from s)
    select m.[25-e], s.RunDT, s.RunID
       from m 
              outer apply( select top(1) * from s where s.RunDT >= m.[25-e] order by s.RunDT asc, iif( s.RunDT = m.[25-e], - RunID, RunID )asc ) as s
10 янв 19, 14:54    [21781700]     Ответить | Цитировать Сообщить модератору
 Re: Нужна view с довольно сложным условием  [new]
RegisteredUser
Member

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

Спасибо)))
Правда не совсем (см. скрин ниже) оно работает как нужно, но я подрихтую...

П.С.
Мысль свою я описал чуть ниже курсивом с добавлением скрина,
Но впредь буду внимательнее.
Спасибо за помощь

К сообщению приложен файл. Размер - 87Kb
10 янв 19, 15:06    [21781717]     Ответить | Цитировать Сообщить модератору
 Re: Нужна view с довольно сложным условием  [new]
invm
Member

Откуда: Москва
Сообщений: 8671
with t as
(
 select
  *,
  row_number() over (partition by b.RunDT26 order by abs(datediff(second, a.RunDT, b.RunDT26))) as rn
 from
  Таблица a cross apply
  (select cast(dateadd(day, 26, dateadd(day, -day(a.RunDT), a.RunDT)) as date)) b(RunDT26)
)
select RunID, RunDT from t where rn = 1;
10 янв 19, 15:30    [21781764]     Ответить | Цитировать Сообщить модератору
 Re: Нужна view с довольно сложным условием  [new]
RegisteredUser
Member

Откуда:
Сообщений: 505
invm
with t as
(
 select
  *,
  row_number() over (partition by b.RunDT26 order by abs(datediff(second, a.RunDT, b.RunDT26))) as rn
 from
  Таблица a cross apply
  (select cast(dateadd(day, 26, dateadd(day, -day(a.RunDT), a.RunDT)) as date)) b(RunDT26)
)
select RunID, RunDT from t where rn = 1;


Спасибо!
Всё в точку!
10 янв 19, 16:23    [21781857]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить