Может ли кто-нибудь помочь мне изменить приведенный ниже код с помощью аналитической / агрегатной функции, поскольку я должен использовать его для создания материализованного представления с возможностью быстрого принятия обновления.
SELECT col1, col2
FROM ( SELECT DISTINCT table_A.column3, table_b.column4,
CASE WHEN table_b.col5 = 'A' THEN RANK() OVER (PARTITION BY table_A.col1, table_b.col5 ORDER BY table_b.col6, table_b.col7 DESC) END AS rnk_a,
CASE WHEN table_b.col5 = 'Z' THEN RANK() OVER (PARTITION BY table_A.col1, table_b.col5 ORDER BY table_b.col6 DESC, table_b.col7 DESC) END AS rnk_z
FROM table_A
INNER JOIN table_B sc ON tale_B.col4 = table_a.col3
)
WHERE (RNK_A = 1) OR (RNK_Z = 1)
*sample dataset:*
id col5 col6 col7
A1A150 A 001 20245
A1A150 A 002 20246
A1A150 A 002 20244
A1A150 Z 001 1023
A1A150 Z 002 1022
Expected resultset:
id col5 col6 col7
A1A150 A 002 20246
A1A150 Z 001 1023
** Если найдено несколько записей для col5 = 'A' или col5 = 'Z': возьмите min (col6) и max (col7)
, когда несколько записей с loc= 'A' или loc = 'Z' с тем же значением col5 и diff col7 найдено, максимальная логика не работает. пожалуйста, поправьте меня, где я иду не так.
SELECT col1, col2 FROM ( SELECT DISTINCT table_A.column3, table_b.column4,
CASE WHEN table_b.col5 = 'A' AND table_b.col7 = (SELECT MAX(table_b.col7) FROM table_b cp1 WHERE cp1.id = table_A.col1 GROUP BY table_A.col1)THEN 1 ELSE 0 END AS rnk_a,
CASE WHEN table_b.col5 = 'Z' AND table_b.col7 = (SELECT MAX(table_b.col7) FROM table_b cp1 WHERE cp1.id = table_A.col1 GROUP BY table_A.col1)THEN 1 ELSE 0 END AS rnk_z
FROM table_A
INNER JOIN table_B sc ON tale_B.col4 = table_a.col3
)
WHERE (RNK_A = 1) OR (RNK_Z = 1)