powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужна view с довольно сложным условием
5 сообщений из 5, страница 1 из 1
Нужна view с довольно сложным условием
    #39757929
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, коллеги!

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

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

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

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е число)
...
Рейтинг: 0 / 0
Нужна view с довольно сложным условием
    #39757935
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Печально я гляжу на ваше поколенье...

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

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

Код: sql
1.
2.
3.
4.
5.
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
...
Рейтинг: 0 / 0
Нужна view с довольно сложным условием
    #39757942
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,

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

П.С.
Мысль свою я описал чуть ниже курсивом с добавлением скрина,
Но впредь буду внимательнее.
Спасибо за помощь
...
Рейтинг: 0 / 0
Нужна view с довольно сложным условием
    #39757967
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;
...
Рейтинг: 0 / 0
Нужна view с довольно сложным условием
    #39758018
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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;



Спасибо!
Всё в точку!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нужна view с довольно сложным условием
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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