繁体   English   中英

如何仅选择列中前 50 个不同值的所有记录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM