Member 11494685 Ответов: 1

Привет, мне нужно получить данные по группам по неделям. Если данные отсутствуют в течение одной недели, то получите их с самой последней недели.


У меня есть такие данные

Ввод
Name | Date | Total
-------------------
AA | 2016-06-13 | 4
BB | 2016-06-13 | 3
CC | 2016-06-13 | 2
AA | 2016-06-20 | 6



Нужен такой вывод
Name | Date | Total
-------------------
AA | 2016-06-13 | 4
BB | 2016-06-13 | 3
CC | 2016-06-13 | 2
AA | 2016-06-20 | 6
BB | 2016-06-20 | 3
CC | 2016-06-20 | 2


Это групповые данные по неделям. Если данных за эту неделю нет, то получите самые последние данные за неделю.
Здесь у АА есть данные за 2016-06-13 и 2016-06-20 недели. Но для BB и CC у нас нет данных за неделю 2016-06-20, в этом случае нужно получить данные с самой последней недели, какие данные доступны (т. е. 2016-06-13)

Мне нужно получить данные по группам по неделям. Если данные отсутствуют в течение одной недели, то получите их с самой последней недели.

CodeReady

Ваш вывод кажется мне запутанным, но для группы по неделям или некоторому диапазону дат; вы пробовали что-нибудь из этого:
1. http://stackoverflow.com/questions/6351734/how-to-group-by-date-range-in-sql
2. http://stackoverflow.com/questions/3012895/group-by-date-range-on-weeks-months-interval

Member 11494685

На сегодняшний день 2016-06-13 у нас есть данные в таблице для aa,bb и CC. Но за 2016-06-20 годы у нас есть данные только по АА. Но мне нужно выбрать запрос, чтобы получить данные для BB и CC (Если данных нет на эту дату 2016-06-20, то получить с предыдущей даты, то есть 2016-06-13), как показано в приведенном выше выводе.

Maciej Los

http://www.codeproject.com/Questions/1107777/Week-wise-data-from-SQL

1 Ответов

Рейтинг:
1

CHill60

Это довольно интересная проблема в том, что вам нужно сгенерировать недостающие строки (даты) для каждого имени и определить последнее ненулевое значение. Последняя является классической проблемой, для которой нет очевидного простого решения. Я собираюсь адаптировать решение, которое я нашел здесь - Последнее ненулевое / T-SQL содержимое из SQL Server Pro[^ но вы можете найти с помощью функции поиска "последние версии SQL непустое значение"

Я также решил использовать CTEs для разбиения запроса, чтобы легче было видеть, что происходит...

;with CTE AS
(
	select [Name], [Date] from
	(select distinct [Name] from myTable) q1
	cross join
	(select distinct [Date] from myTable) q2
), CTE2 AS
(
	SELECT ROW_NUMBER() OVER (ORDER BY q1.[Date],q1.[Name]) rn, q1.[Name], q1.[Date], a.Total
	FROM CTE q1
	LEFT OUTER JOIN myTable a ON q1.Name = a.Name AND q1.Date = a.Date
)
SELECT[Name], [Date],  
CAST(SUBSTRING(MAX( CAST(rn AS BINARY(4)) + CAST(total AS BINARY(4)))
                    OVER( partition by [Name] ORDER BY rn
                    ROWS UNBOUNDED PRECEDING ),
            5, 4) AS INT) AS total
FROM CTE2
ORDER BY [Date], [Name]

Первая часть (CTE) генерирует недостающие даты для каждого имени - вместе с предоставленными вами образцами данных она возвращает
Name    Date
AA	2016-06-13
BB	2016-06-13
CC	2016-06-13
AA	2016-06-20
BB	2016-06-20
CC	2016-06-20

2-я часть (CTE2) генерирует номер строки для каждой записи в таблице и пытается получить общее значение из исходной таблицы. Он возвращается
rn      Name    Date            Total
1	AA	2016-06-13	4
2	BB	2016-06-13	3
3	CC	2016-06-13	2
4	AA	2016-06-20	6
5	BB	2016-06-20	NULL
6	CC	2016-06-20	NULL

Последний бит (см. ссылку выше для более полного объяснения) объединяет номер строки и общее значение в виде 2 двоичных значений, таким образом, максимальное значение этого объединенного столбца будет содержать последнее ненулевое значение-затем мы деконструируем этот столбец, чтобы получить искомое значение.
И все это возвращается
Name    Date            Total
AA	2016-06-13	4
BB	2016-06-13	3
CC	2016-06-13	2
AA	2016-06-20	6
BB	2016-06-20	3
CC	2016-06-20	2


Maciej Los

5ед! Идеально!