#sql #database-partitioning #netezza
#sql #разделение базы данных #netezza
Вопрос:
Я пытаюсь создать таблицу NETEZZA, в которой есть только самые последние записи для определенного ключа — например, представьте таблицу (MYTABLE) следующим образом:
Col1 Col2 TIMESTAMP
xxxx xxxx 13:45
xxxx xxxx 13:46
xxxx yyyy 10:00
Я хотел бы вернуть таблицу следующим образом:
Col1 Col2 TIMESTAMP
xxxx xxxx 13:46
xxxx yyyy 10:00
Я предполагаю, что мне нужен некоторый код в соответствии с:
Create table MYNEWTABLE as
select *
from MYTABLE
WHERE rowid in
(
SELECT LAST_VALUE(rowid)
OVER (PARTITION BY COL1, COL2
ORDER BY TIMESTAMP)
FROM MYTABLE
)
ORDER BY COL1,COL2
distribute on (COL1)
Однако на самом деле это не работает, может кто-нибудь посоветовать? (в частности, как фильтровать таблицу по последнему значению метки времени в разделе col1 / col2)
Ответ №1:
Наконец-то понял! rowid был неправильным. Спасибо Шону Фоксу из сообщества Netezza за вдохновение.
Create table MYNEWTABLE as select * from
(select *
,row_number() over (
partition by COL1, COL2 order by TIMESTAMP desc
) row
from MYTABLE
) x
WHERE x.row=1
distribute on (COL1)
Ответ №2:
Приведенный ниже запрос должен работать нормально.
СОЗДАЙТЕ ТАБЛИЦУ TIMESTAMP_DATA_LATEST КАК ВЫБЕРИТЕ Col1,Col2,MAX(Timestamp_val) КАК Latest_TimeStamp ИЗ TIMESTAMP_DATA GROUP ПО Col1,Col2;
С уважением, Венк
Комментарии:
1. хммм — не думаю, что так, возможно, мой вопрос был неясен (следовало добавить несколько фиктивных записей). Я хочу создать таблицу, содержащую только самые ПОСЛЕДНИЕ ЗАПИСИ для определенного ключа.. (В примере я показал только ключ и временную метку).
Ответ №3:
если вы пытаетесь реализовать SCD2 .. я имею в виду вставку только новой записи в целевую таблицу из исходной таблицы, тогда вы можете выполнить left outer join и вставить данные в цель. поправьте меня, если ваши требования отличаются