我有这样的数据:
some_data, p_column, type
pla, 1, a
bla, 1, b
sth, 1, a
sth, 2, a
可以说我在some_data中通过p_column对某些降序日期进行分区,并且得到了排名:
some_data, p_column, type, rank
pla, 1, a, 1
bla, 1, b, 2
sth, 1, a, 3
sth, 2, a, 1
对于每个分区,我想选择类型为b的最低排的行,否则如果分区中没有类型为b的行,我想选择类型为a的最低排的行。
所以我会得到行(例如):
some_data, p_column, type, rank
bla, 1, b, 2
sth, 2, a, 1
如果不清楚,我附上伪代码:
for each partition:
if type b is in partition:
select row b with lowest rank
else:
select row a with lowest rank
答案 0 :(得分:2)
接近这一点的一种概念性方法是认识到你真的想要一个双重分区,一个层用于p_column
,另一个层用于type
。根据您的优先规则,您希望b
类型的优先级高于a
。因此,我们可以在p_column
上对type
进行分区,然后再次使用行号为每个分区选择最低记录。
SELECT some_data, p_column, type
FROM
(
SELECT some_data, p_column, type,
ROW_NUMBER() OVER (PARTITION BY p_column
ORDER BY CASE WHEN type = 'b' THEN 0 ELSE 1 END) rn
FROM
(
SELECT some_data, p_column, type,
RANK() OVER (PARTITION BY p_column, type ORDER BY some_date_col) rank
FROM yourTable
) t
WHERE t.rank = 1
) t
WHERE t.rn = 1
ORDER BY p_column;