在另一列中对某些条件进行分区

时间:2017-11-24 11:18:36

标签: sql

我有这样的数据:

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

1 个答案:

答案 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;

enter image description here

Demo