powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Обновить таблицу со списком дат количеством попаданий этих дат из диапазонов другой
6 сообщений из 6, страница 1 из 1
Обновить таблицу со списком дат количеством попаданий этих дат из диапазонов другой
    #39581451
Maestro NV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Признаться, со своим вопросом даже не знал, как правильно тему написать.

Для отчёта создаётся временная табличка-календарик со списком дат и количеством пападаний.
Для примера:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
declare @temp table (D date, X int default 0)
insert into @temp 
  (D)
  values 
  ('01.01.18'),
  ('02.01.18'),
  ('03.01.18'),
  ('04.01.18'),
  ('05.01.18'),
  ('06.01.18')



Есть другая табличка в которой имеются записи с указанием периода работы. Начальная и конечная даты.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
create table periods (S date, E date)
insert into periods
  values
  ('25.10.17', '05.01.18'),
  ('20.04.16', '30.10.17'),
  ('02.01.18', '05.01.18'),
  ('08.01.18', '09.01.18'),
  ('03.01.18', '10.01.18')


Записей сотни тысяч за несколько лет. Они могут полностью попадать в расчётный период или частично. Или вообще не попадать:

Хочется узнать, есть ли элегантный способ обновления временной таблички при такой ситуации?
Что бы для каждого дня подсчитать количество записей, попавших в диапазон?
Не считая варианта с курсором в голову приходи такой вариант:
Код: sql
1.
2.
3.
update t
  set X = (select count(*) from periods where t.D between S and E)	
  from @temp t



Но это хорошо для такого простого варианта. А когда реальный подзапрос состоит не из одной таблички, а из множества связанных с большим количеством условий, то такой вариант уже работает очень тяжело. Особенно когда надо сделать выборку за несколько месяцев.
Как вариант сперва попробовать нужные записи из этой выборки вытащить ещё в одну временную табличку и уже потом её использовать в подзапросе.

Но мне интересно, может быть есть какой-то более простой способ всё это подсчитать не делая подзапросы по каждому дню отдельно?
...
Рейтинг: 0 / 0
Обновить таблицу со списком дат количеством попаданий этих дат из диапазонов другой
    #39581469
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maestro NVтакой вариант уже работает очень тяжело
А что там с индексами на таблицах? Если их нет (как показано) - то как ни делай, всё одно хреново получится. А если их есть - то надо верстать решение в зависимости от того, каких именно их есть.
...
Рейтинг: 0 / 0
Обновить таблицу со списком дат количеством попаданий этих дат из диапазонов другой
    #39581475
Maestro NV,

почитай про Merge.
...
Рейтинг: 0 / 0
Обновить таблицу со списком дат количеством попаданий этих дат из диапазонов другой
    #39581490
Maestro NV,

в твоем исходном тестовом примере решение могло бы выглядеть примерно так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
merge into @temp d
using (
        select t.D, count(1) as cnt
          from @temp t
          join periods p
            on t.d between p.s and p.e
         group by t.d
      ) s
   on (d.d = s.d)
 when matched 
   then update set d.x = s.cnt;
...
Рейтинг: 0 / 0
Обновить таблицу со списком дат количеством попаданий этих дат из диапазонов другой
    #39581609
Maestro NV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - ЭхMaestro NV,

почитай про Merge.

Спасибо за наводку. Как-то так получилось, что про merge ничего и не знаю.
Надо изучить.
...
Рейтинг: 0 / 0
Обновить таблицу со списком дат количеством попаданий этих дат из диапазонов другой
    #39581612
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для дат используйте ISO написание, не зависящее от языковых настроек
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SET DATEFORMAT mdy
DECLARE @date11 DATE
DECLARE @date12 DATE
DECLARE @date13 DATE
DECLARE @date2 DATETIME2(7)
DECLARE @date3 DATETIME
SET @date11 = '01.02.18' -- интерпретация зависит от языковых настроек и SET DATEFORMAT
SET @date12 = '20180201' -- ISO для DATE/DATETIME/DATETIME2
SET @date13 = '2018-02-01' -- ISO для DATE/DATETIME2
SET @date2 = '2018-02-01T00:00:00.0000000' -- ISO DATETIME2
SET @date3 = '2018-02-01T00:00:00.000' -- ISO DATETIME
SELECT @date11, @date12, @date13, @date2, @date3

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


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