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

Откуда:
Сообщений: 14
День добрый, друзья
Есть две таблицы (см. файл) Задача из одной сделать другую. Никак не могу сформировать алгоритм действий. Застрял на том, чтобы выбрать отдельные группы строк данных с одинаковыми типами за текущий и предыдущий день.

К сообщению приложен файл. Размер - 143Kb
2 май 17, 13:26    [20449888]     Ответить | Цитировать Сообщить модератору
 Re: Агрегация данных  [new]
euronimus33
Member

Откуда:
Сообщений: 14
Если есть мысли, поделитесь пожалуйста.
2 май 17, 13:28    [20449897]     Ответить | Цитировать Сообщить модератору
 Re: Агрегация данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31328
euronimus33
Никак не могу сформировать алгоритм действий. Застрял на том, чтобы выбрать отдельные группы строк данных с одинаковыми типами за текущий и предыдущий день.
Ничего непонятно, что вам надо сделать.

Вам этот "алгоритм" нужно выяснять у постановщиков задачи, а тут уже можно получить помощь в коде, запросах.
2 май 17, 13:42    [20449987]     Ответить | Цитировать Сообщить модератору
 Re: Агрегация данных  [new]
aleks2
Guest
alexeyvg
euronimus33
Никак не могу сформировать алгоритм действий. Застрял на том, чтобы выбрать отдельные группы строк данных с одинаковыми типами за текущий и предыдущий день.
Ничего непонятно, что вам надо сделать.

Вам этот "алгоритм" нужно выяснять у постановщиков задачи, а тут уже можно получить помощь в коде, запросах.


Тут любая ванга справится.
Страдальцу нужно вместо "подряд идущих строк CURRENT_TYPE - одну с объединеным интервалом времени.

Зы это так банально аж скучно.
2 май 17, 13:56    [20450065]     Ответить | Цитировать Сообщить модератору
 Re: Агрегация данных  [new]
euronimus33
Member

Откуда:
Сообщений: 14
alexeyvg, задача в следующем:
1) удалить строки содержащие одинаковые типы за вчерашний и сегодняшний день
2) в строке ПЕРЕД группой одинаковых строк (в этой строке типы не совпадают но идет заход в тип, который дублируется в группе) необходимо в количестве дней зачесть все те дни, что удалили
3) в этой же строке необходимо изменить текущую дату на максимальную текущую дату из тех строк, что удалили.
Получается своего рода некая агрегация

Проблема в данном случае заключается в однозначном определении какая группа к какой из строк с разными стратегиями "принадлежит".
2 май 17, 13:56    [20450067]     Ответить | Цитировать Сообщить модератору
 Re: Агрегация данных  [new]
euronimus33
Member

Откуда:
Сообщений: 14
aleks2, для Вас может банально, для меня нет. Пока не пойму как сделать правильную привязку строк с дублирующимися типами к соответсвующей строке с недублирующимися
2 май 17, 14:00    [20450080]     Ответить | Цитировать Сообщить модератору
 Re: Агрегация данных  [new]
aleks2
Guest
euronimus33
aleks2, для Вас может банально, для меня нет. Пока не пойму как сделать правильную привязку строк с дублирующимися типами к соответсвующей строке с недублирующимися


Осподе, достаточно искать не "повторы", а "изменения". Между "изменениями" - сплошные повторы.
2 май 17, 14:06    [20450118]     Ответить | Цитировать Сообщить модератору
 Re: Агрегация данных  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Ох, я люблю интервалы, на них такие "YOлки" красивые получаются
IF OBJECT_ID( 'tempdb..#test' ) IS NOT NULL
  DROP TABLE #test
;
CREATE TABLE #test (
  [ID] INT NOT NULL,
  [CURRENT_DATE] DATETIME NOT NULL,
  [CURRENT_TYPE] VARCHAR(2) NOT NULL,
  [PREVIOUS_DATE] DATETIME NOT NULL,
  [PREVIOUS_TYPE] VARCHAR(2) NOT NULL
)
INSERT 
INTO
  #test
VALUES
  ( 7756487, '20140722', 'XX', '20140721', 'ZZ' ),
  ( 7756487, '20150324', 'Y',  '20140722', 'XX' ),
  ( 7756487, '20150628', 'Y',  '20150324', 'Y'  ),
  ( 7756487, '20151003', 'Y',  '20150628', 'Y'  ),
  ( 7756487, '20160109', 'Y',  '20151003', 'Y'  ),
  ( 7756487, '20160415', 'LL', '20160109', 'Y'  ),
  ( 7756487, '20160724', 'Y',  '20160415', 'LL' ),
  ( 7756487, '20161030', 'Y',  '20160724', 'Y'  ),
  ( 7756487, '20170205', 'Y',  '20161030', 'Y'  ),
  ( 7756487, '20170321', 'Y',  '20170205', 'Y'  ),
  ( 7756487, '20170322', 'Y',  '20170321', 'Y'  )
;
WITH
t0 AS (
  SELECT
    [ID],
    [CURRENT_TYPE],
    [CURRENT_DATE],  
    [PREVIOUS_TYPE],
    [PREVIOUS_DATE],  
    [GN] = ROW_NUMBER()
           OVER (
             PARTITION BY 
               [ID]
             ORDER BY 
               [CURRENT_DATE] )
         - ROW_NUMBER()
           OVER (
             PARTITION BY
               [ID],
               [CURRENT_TYPE]
             ORDER BY
               [CURRENT_DATE] )
  FROM
    #test
),
t1 AS (
  SELECT
    [ID],
    [CURRENT_DATE] = MAX( [CURRENT_DATE] ),
    [CURRENT_TYPE],
    [PREVIOUS_DATE] = MIN( [PREVIOUS_DATE] )
  FROM
    t0
  GROUP BY
    [ID],
    [CURRENT_TYPE],
    [GN]
)
SELECT
  t1.[ID],
  t1.[CURRENT_DATE],
  t1.[CURRENT_TYPE],
  t1.[PREVIOUS_DATE],
  t.[PREVIOUS_TYPE],
  [DAYS_BEFORE] = DATEDIFF( DAY, t1.[PREVIOUS_DATE], t1.[CURRENT_DATE] )
FROM
  t1
  INNER JOIN #test t ON (
        t.[ID] = t1.[ID]
    AND t.[CURRENT_DATE] = t1.[CURRENT_DATE] )
3 май 17, 09:57    [20452204]     Ответить | Цитировать Сообщить модератору
 Re: Агрегация данных  [new]
лолл
Member

Откуда:
Сообщений: 450
А почему бы не использовать тип данных Date?
3 май 17, 10:14    [20452274]     Ответить | Цитировать Сообщить модератору
 Re: Агрегация данных  [new]
iiyama
Member

Откуда:
Сообщений: 642
euronimus33,
declare @t table(ID int, [CURRENT_DATE] date, [CURRENT_TYPE] varchar(2), [PREVIOS_DATE] date, PREVIOS_TYPE varchar(2), DAYSBEFORE int)
insert into @t values
 (7756487,'20140722','XX','20140721','ZZ',1)
,(7756487,'20150324','Y', '20140722','XX',245)
,(7756487,'20150628','Y', '20150324','Y',96)
,(7756487,'20151003','Y', '20150628','Y',97)
,(7756487,'20160109','Y', '20151003','Y',98)
,(7756487,'20160415','LL','20160109','Y',97)
,(7756487,'20160724','Y', '20160415','LL',100)
,(7756487,'20161030','Y', '20160724','Y',98)
,(7756487,'20170205','Y', '20161030','Y',98)
,(7756487,'20170321','Y', '20170205','Y',44)
,(7756487,'20170322','Y', '20170321','Y',1)
 
;with T as 
(
select 
CASE WHEN ISNULL(LAG([CURRENT_TYPE]) OVER(order by [CURRENT_DATE]),'') <> [CURRENT_TYPE] THEN 1 ELSE 0 END is_first,
CASE WHEN ISNULL(LEAD([CURRENT_TYPE]) OVER(order by [CURRENT_DATE]),'') <> [CURRENT_TYPE] THEN 1 ELSE 0 END is_last,
*
from @T
)

select 
 LEvent.ID
 ,LEvent.[CURRENT_DATE]
 ,LEvent.CURRENT_TYPE
 ,FEvent.[PREVIOS_DATE]
 ,FEvent.PREVIOS_TYPE
 ,DATEDIFF(dd,  FEvent.[PREVIOS_DATE], LEvent.[CURRENT_DATE]) AS [DAYSBEFORE]
from T AS LEvent
	CROSS APPLY
	(
	 select top 1 * from T T2 WHERE T2.CURRENT_TYPE=LEvent.CURRENT_TYPE AND T2.is_first=1 AND T2.[CURRENT_DATE]<=LEvent.[CURRENT_DATE] ORDER BY T2.[CURRENT_DATE] DESC
	)FEvent
WHERE LEvent.is_last=1
ORDER BY LEvent.[CURRENT_DATE]
3 май 17, 10:40    [20452365]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить