2016-09-29 4 views
0

У меня есть таблица в Redshift, который имеет столбец даты плюс некоторые другие данные:Получить недостающие даты из таблицы в Redshift

+------------+-------+ 
| Date | Value | 
+------------+-------+ 
| 2016-09-25 |  1 | 
| 2016-09-28 |  2 | 
| 2016-09-29 |  3 | 
+------------+-------+ 

Я хочу, чтобы получить «недостающую» дату из этой таблицы. Таким образом, из примера выше, если бы я хотел, чтобы получить все недостающие даты от 7 дней назад до сих пор, я хотел бы, чтобы произвести запрос, который возвращает:

2016-09-22 
2016-09-23 
2016-09-24 
2016-09-26 
2016-09-27 

Я пытаюсь использовать generate_series (..) чтобы произвести все даты, а затем отфильтровать их для того, что уже существует в моей таблице. Итак, что-то вроде:

select CURRENT_DATE + i as MyDate 
from generate_series(date '2016-09-22'- CURRENT_DATE, date '2016-09-29' - CURRENT_DATE) i 
where MyDate not in (select [Date] from MyTable) 

В этом случае у меня есть ошибка «MyDate» не существует. Я пытался также с помощью и за исключением пункта, который затем производит ошибку:

INFO: Function "generate_series(integer,integer)" not supported. 

[Err] ERROR: Specified types or functions (one per INFO message) not supported on Redshift tables. 

Различные другие вещи, которые я пробовал производить эту ошибку, я могу запустить generate_series (..), когда его самостоятельно, но если я попробовать с любой другой оговоркой и т. д. она падает.

Возможно ли это в Redshift?

ответ

1

Мне удалось найти один рабочий процесс, который включает в себя другой способ генерации диапазона чисел без использования generate_series (..). Не знаю, насколько это возможно, но это может помочь. Кредит на блог, который я нашел связанным ниже. В своем примере я думаю, что они предлагают, чтобы сбросить число в таблицу и использовать это, но ниже я просто использовал подзапрос, чтобы показать:

https://discourse.looker.com/t/generating-a-numbers-table-in-mysql-and-redshift/482

SELECT CURRENT_DATE - CAST (days AS INT) AS [Date] 
FROM 
(SELECT 
    CAST (p0.n + p1.n*2 + p2.n * POWER(2,2) + p3.n * POWER(2,3)+ p4.n * POWER(2,4)+ p5.n * POWER(2,5) AS INT) AS days 
     FROM 
     (SELECT 0 as n UNION SELECT 1) p0, 
     (SELECT 0 as n UNION SELECT 1) p1, 
     (SELECT 0 as n UNION SELECT 1) p2, 
     (SELECT 0 as n UNION SELECT 1) p3, 
     (SELECT 0 as n UNION SELECT 1) p4, 
     (SELECT 0 as n UNION SELECT 1) p5 
WHERE (p0.n + p1.n*2 + p2.n * POWER(2,2) + p3.n * POWER(2,3)+ p4.n * POWER(2,4)+ p5.n * POWER(2,5)) <= 7 
) 
EXCEPT 
SELECT Date FROM MyTable 

Примечание: в моем первоначальном примере я бы требуется только первые 3 значения (до p3 в выборе). Этот пример будет охватывать все больше и больше номеров

1

Redshift не полностью поддерживает gener_series, и я обнаружил, что вы можете использовать его самостоятельно, но затем генерируемые им данные не могут каким-либо образом сочетаться с любой другой функцией красного смещения.

Вашего лучший вариант, чтобы создать таблицу красного смещения с одной строкой в ​​день, а также использовать эту таблицу в объединении следующего

select date from dates_table 
where date not in (select date from my_table) 

Есть источники, доступные для этого списка дат в таблице, это таблица часто упоминается как измерение даты и используется в хранилищах данных звездной схемы.

, например sisense date dimension

Это может быть столь же легко использовать первенствовать, например, для получения списка дат, а затем сохранить как CSV

Используйте команду красных смещений COPY для загрузки даты, чтобы таблицу красного смещения.

+0

Ah okay пытался избежать этого, но похоже, что выбора не так много. Я попробовал загружать даты в временную таблицу, но, как вы говорите, если вы ее сочетаете с чем угодно - даже вставкой, она не работает – MartinM

+0

Я дал ответ, который может быть интересен :) – MartinM