Применение оконной функции отбрасывает события в результате

Если вы используете 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 |

0
задан John Doe 17 January 2019 в 10:01
поделиться

2 ответа

Хорошо, я думаю, я знаю, что пошло не так. Ошибка случается, потому что я неправильно подумал о проблеме. Поскольку я использую Eventtime, окна закрываются, когда приходит событие, которое имеет временную метку, превышающую время окончания окна. Когда поток заканчивается, элемент больше не поступает. Отсюда следует, что окно никогда не закрывается.

0
ответ дан John Doe 17 January 2019 в 10:01
поделиться

Чтобы быть более точным, временное окно события закрывается при поступлении подходящего водяного знака - что с генератором водяного знака ограниченной упорядоченности произойдет (1), если поступит событие, которое находится достаточно далеко от окна, или (2) если события приходят из конечного источника, который достигает своего конца, потому что в этом случае Flink отправит водяной знак с отметкой времени Long.MAX_VALUE, которая закроет все открытые окна времени события. Однако с Кафкой в ​​качестве источника этого не произойдет.

0
ответ дан David Anderson 17 January 2019 в 10:01
поделиться