【问题标题】:Select first row of group with criteria选择具有条件的组的第一行
【发布时间】:2017-04-12 13:31:13
【问题描述】:

我有一个这种格式的表格:

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

我想为每个 FieldA 选择一个 FieldB,优先于 FieldC 中的 X(如果没有 X,请选择另一个)。

我已尝试将 RANK 函数与 PARTITION BY 一起使用,但我发现它太不一致了,我现在已经碰壁了。

我的输出如下所示:

 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

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

【问题讨论】:

  • 如果你有 2 个X,你应该两个都买吗?如果没有,另一个要优先考虑的值是什么?
  • 您可以发布您尝试过的查询吗?

标签: sql hive impala


【解决方案1】:

你可以像这样使用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' 的记录优先于所有其他记录。

【讨论】:

  • 绝对精彩!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
相关资源
最近更新 更多