Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
euronimus33 Member Откуда: Сообщений: 14 |
День добрый, друзья Есть две таблицы (см. файл) Задача из одной сделать другую. Никак не могу сформировать алгоритм действий. Застрял на том, чтобы выбрать отдельные группы строк данных с одинаковыми типами за текущий и предыдущий день. К сообщению приложен файл. Размер - 143Kb |
2 май 17, 13:26 [20449888] Ответить | Цитировать Сообщить модератору |
euronimus33 Member Откуда: Сообщений: 14 |
Если есть мысли, поделитесь пожалуйста. |
2 май 17, 13:28 [20449897] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Вам этот "алгоритм" нужно выяснять у постановщиков задачи, а тут уже можно получить помощь в коде, запросах. |
||
2 май 17, 13:42 [20449987] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Тут любая ванга справится. Страдальцу нужно вместо "подряд идущих строк CURRENT_TYPE - одну с объединеным интервалом времени. Зы это так банально аж скучно. |
||||
2 май 17, 13:56 [20450065] Ответить | Цитировать Сообщить модератору |
euronimus33 Member Откуда: Сообщений: 14 |
alexeyvg, задача в следующем: 1) удалить строки содержащие одинаковые типы за вчерашний и сегодняшний день 2) в строке ПЕРЕД группой одинаковых строк (в этой строке типы не совпадают но идет заход в тип, который дублируется в группе) необходимо в количестве дней зачесть все те дни, что удалили 3) в этой же строке необходимо изменить текущую дату на максимальную текущую дату из тех строк, что удалили. Получается своего рода некая агрегация Проблема в данном случае заключается в однозначном определении какая группа к какой из строк с разными стратегиями "принадлежит". |
2 май 17, 13:56 [20450067] Ответить | Цитировать Сообщить модератору |
euronimus33 Member Откуда: Сообщений: 14 |
aleks2, для Вас может банально, для меня нет. Пока не пойму как сделать правильную привязку строк с дублирующимися типами к соответсвующей строке с недублирующимися |
2 май 17, 14:00 [20450080] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Осподе, достаточно искать не "повторы", а "изменения". Между "изменениями" - сплошные повторы. |
||
2 май 17, 14:06 [20450118] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович 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] Ответить | Цитировать Сообщить модератору |
лолл Member Откуда: Сообщений: 450 |
А почему бы не использовать тип данных Date? |
3 май 17, 10:14 [20452274] Ответить | Цитировать Сообщить модератору |
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 | ![]() |