[英]How to select all records for only the first 50 distinct values in a column
我正在尝试为数据集创建分类器模型,但我的目标变量有太多不同的值。 如果我运行这样的东西:
Create or replace model `model_name`
options (model_type="AUTOML_CLASSIFIER", input_label_cols=["ORIGIN_AIRPORT"]) as
select DAY_OF_WEEK, ARRIVAL_TIME, ARRIVAL_DELAY, ORIGIN_AIRPORT
from `table_name`
limit 1000
我最终得到
运行查询时出错
分类模型目前只支持最多50个唯一标签的分类,标签列有111个唯一标签。
那么,例如,我如何选择具有ORIGIN_AIRPORT
的前 50 个值之一的所有行?
给定一个包含唯一标识符 (id) 的值 (val) 表,找到每个唯一值 (val) 的最小 id (mid)
返回与前 3 个(密集排列,按 min id (mid))vals 匹配的所有行。
测试数据:
+------+----+
| val | id |
+------+----+
| 1 | 1 |
| 1 | 2 |
| 8 | 3 |
| 8 | 4 |
| 8 | 5 |
| 7 | 6 |
| 7 | 7 |
| 6 | 8 |
| 5 | 9 |
| 4 | 10 |
| 3 | 11 |
| 3 | 12 |
| 7 | 13 |
| 7 | 14 |
| 1 | 15 |
| 8 | 16 |
| 3 | 17 |
| 1 | 18 |
+------+----+
解决方案:
WITH min_ids (val, id, mid) AS (
SELECT val
, id
, MIN(id) OVER (PARTITION BY val) AS mid -- min id per val
FROM vals
)
, ranks (val, id, mid, r) AS (
SELECT val
, id
, mid
, DENSE_RANK() OVER (ORDER BY mid) AS r -- Densely ranked minimum ids
FROM min_ids
)
SELECT *
FROM ranks
WHERE r <= 3 -- Return rows matching r <= 3 (vals = 1, 8, and 7)
ORDER BY r, id
;
最终结果:
+------+----+------+---+
| val | id | mid | r |
+------+----+------+---+
| 1 | 1 | 1 | 1 |
| 1 | 2 | 1 | 1 |
| 1 | 15 | 1 | 1 |
| 1 | 18 | 1 | 1 |
| 8 | 3 | 3 | 2 |
| 8 | 4 | 3 | 2 |
| 8 | 5 | 3 | 2 |
| 8 | 16 | 3 | 2 |
| 7 | 6 | 6 | 3 |
| 7 | 7 | 6 | 3 |
| 7 | 13 | 6 | 3 |
| 7 | 14 | 6 | 3 |
+------+----+------+---+
有多种解决方案。 我们可以获取一个不同的 val 列表并限制返回的行数,然后加入该 val 列表。
由于您最初的问题是获取与前 N 个值匹配的行,因此我使用了更严格的逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.