Если вы используете SQL Server 2005+, вы можете использовать функцию PIVOT
для преобразования данных из строк в столбцы.
Похоже, вам понадобится использовать динамический sql, если недели неизвестны, но вначале легче видеть правильный код с использованием жестко кодированной версии.
Сначала рассмотрим некоторые быстрые определения таблиц и данные для использования:
CREATE TABLE #yt
(
[Store] int,
[Week] int,
[xCount] int
);
INSERT INTO #yt
(
[Store],
[Week], [xCount]
)
VALUES
(102, 1, 96),
(101, 1, 138),
(105, 1, 37),
(109, 1, 59),
(101, 2, 282),
(102, 2, 212),
(105, 2, 78),
(109, 2, 97),
(105, 3, 60),
(102, 3, 123),
(101, 3, 220),
(109, 3, 87);
Если ваши значения известны, тогда вы будете жестко запрограммировать запрос:
select *
from
(
select store, week, xCount
from yt
) src
pivot
(
sum(xcount)
for week in ([1], [2], [3])
) piv;
См. SQL Demo
Затем, если вам нужно сгенерировать неделю номер динамически, ваш код будет:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(Week)
from yt
group by Week
order by Week
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT store,' + @cols + ' from
(
select store, week, xCount
from yt
) x
pivot
(
sum(xCount)
for week in (' + @cols + ')
) p '
execute(@query);
См. SQL Demo .
Динамическая версия генерирует список номеров week
, которые должны преобразуется в столбцы. Оба дают тот же результат:
| STORE | 1 | 2 | 3 |
---------------------------
| 101 | 138 | 282 | 220 |
| 102 | 96 | 212 | 123 |
| 105 | 37 | 78 | 60 |
| 109 | 59 | 97 | 87 |
Хорошо, я думаю, я знаю, что пошло не так. Ошибка случается, потому что я неправильно подумал о проблеме. Поскольку я использую Eventtime, окна закрываются, когда приходит событие, которое имеет временную метку, превышающую время окончания окна. Когда поток заканчивается, элемент больше не поступает. Отсюда следует, что окно никогда не закрывается.
Чтобы быть более точным, временное окно события закрывается при поступлении подходящего водяного знака - что с генератором водяного знака ограниченной упорядоченности произойдет (1), если поступит событие, которое находится достаточно далеко от окна, или (2) если события приходят из конечного источника, который достигает своего конца, потому что в этом случае Flink отправит водяной знак с отметкой времени Long.MAX_VALUE, которая закроет все открытые окна времени события. Однако с Кафкой в качестве источника этого не произойдет.