如何根据条件汇总数据

时间:2020-09-02 07:52:47

标签: sql google-bigquery

具有下表:

+--------+-------+-------+-------+
| categ. | elem. | atr_1 | atr_2 |
+--------+-------+-------+-------+
|      1 |     1 |     2 |     1 |
|      1 |     2 |     2 |     2 |
|      2 |     3 |     1 |     3 |
|      2 |     4 |     1 |     3 |
+--------+-------+-------+-------+

...我正在尝试获取显示每个类别最佳元素的结果表:

+--------+--------+
| categ. | elem.  |
+--------+--------+
|      1 |      2 |
|      2 |      3 |
+- ------+--------+

为了确定哪个元素是每个类别的“最佳”元素,系统需要检查哪个元素具有每个类别的max(atr_1)。如果检索到多个元素,则将查看检索到的元素的max(atr_2)。如果检索到多个元素,则将其中一个元素随机分配到类别。

我无法弄清楚如何汇总和使用条件语句来构成所需的查询。有什么建议吗?

我在Google BigQuery中使用标准SQL。

预先感谢

3 个答案:

答案 0 :(得分:0)

我们可以在此处使用ROW_NUMBER

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY category ORDER BY atr_1 DESC, atr_2 DESC) rn
    FROM yourTable
)

SELECT category, element
FROM cte
WHERE rn = 1;

答案 1 :(得分:0)

BigQuery的解决方法只是使用聚合:

select (array_agg(t order by atr_1 desc, atr_2 desc limit 1))[ordinal(1)].* except (atr_1, atr_2)
from t
group by categ;

答案 2 :(得分:0)

以下是用于BigQuery标准SQL

#standardSQL
SELECT AS VALUE 
  ARRAY_AGG(
    STRUCT(categ, elem) ORDER BY atr_1 DESC, atr_2 DESC LIMIT 1
  )[OFFSET(0)]
FROM `project.dataset.table`
GROUP BY categ   

如果要应用于您的问题的样本数据-输出为

Row categ   elem     
1   1       2    
2   2       3