选择标准为

时间:2017-04-12 13:31:13

标签: sql hive impala

我有一个这种格式的表:

FieldA   FieldB   FieldC
1111     ABC      X
1111     DEF      Y
1111     GHI      X
2222     JKL      Y
2222     MNO      X
3333     PQR      U
3333     STT      U

我想在FieldC中选择一个FieldB,优先选择FieldC中的X(如果没有X,则选择另一个)。

我尝试过使用PARTITION BY的RANK功能,但我发现它太不一致了,我现在已经到了墙上。

我的输出如下:

 FieldA   FieldB   FieldC
    1111     ABC      X
    2222     MNO      X
    3333     PQR      U

查询:

Select
rank() over (partition by Field3 order by Field1),
Field,1 Field2, Field3
FROM table
ORDER BY Field1, Field3

我猜我需要将该查询放在子查询中......

1 个答案:

答案 0 :(得分:2)

您可以像这样使用ROW_NUMBER

SELECT FieldA, FieldB, FieldC
FROM (
   SELECT FieldA, FieldB, FieldC,
          ROW_NUMBER() OVER (PARTITION BY FieldA
                             ORDER BY CASE 
                                         WHEN FieldC = 'X' THEN 1
                                         ELSE 2
                                      END,
                                      FieldB) AS rn 
   FROM mytable) AS t
WHERE t.rn = 1

上述查询从每个FieldA分区中选取一条记录。它优先考虑FieldC = 'X'超过所有其他记录的记录。