从SQL中许多列名中具有最高值的前2个列名中获取二进制值

孙凯文

我有一个如下表:

ID col1 col2 col3 第4列
一种 100 400 30 800
600 50 500 75

我想要一个查询,我可以返回类似

ID col1 col2 col3 第4列
一种 0 1个 0 1个
1个 0 1个 0

除此之外,我希望逻辑查看每一行,并为每一行查找哪两列的前2个值最高。我想可能会涉及一些CTE或子查询。即使是会产生以下结果的CTE也足够好,但不知道如何达到此CTE:

ID top_2_col_name
一种 col2
一种 第4列
col1
col3

有没有一种方法可以按行而不是按列进行聚合和窗口函数?我正在使用Google的BigQuery SQL。

戈登·利诺夫

如果需要前两个值,则一种方法是取消嵌套这些值并计算排名并选择它们:

with t as (
      select 'A' as id, 100 as col1, 400 as col2,  30 as col3, 800 as col4 union all
      select 'B' as id, 600 as col1, 50  as col2, 500 as col3, 75 as col4 
     )
select * except (seqnum)
from (select t.id, col.*, row_number() over (partition by t.id order by col.val desc) as seqnum
      from t cross join
           unnest(array[struct('col1' as col, t.col1 as val),
                              struct('col2', t.col2),
                              struct('col3', t.col3),
                              struct('col4', t.col4)
                             ]
                        ) col
     ) tc
where seqnum <= 2;

这是结果集的第二种形式。

您可以使用JSON技巧将其概括为任意数量的列。这将产生一个字符串,然后为您关心的列解析该字符串,取消嵌套它们并执行类似的操作:

with t as (
      select 'A' as id, 100 as col1, 400 as col2,  30 as col3, 800 as col4 union all
      select 'B' as id, 600 as col1, 50  as col2, 500 as col3, 75 as col4 
     )
select t.id, concat('col', n), val
from (select t.id, val, n, row_number() over (partition by t.id order by val desc) as seqnum
      from t cross join
           unnest(regexp_extract_all(to_json_string(t), '"col[0-9]+":([0-9]+)')) val with offset n
     ) t
where seqnum <= 2;

这可以在任意数量的列上使用。当然,如果您具有这样的数据结构,则值应确实存储在数组中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

获取Javascript中具有最高值的前十个var

来自分类Dev

我必须在oracle的一行中显示具有最高值的列名

来自分类Dev

获取ArrayList中具有最高值的特定元素

来自分类Dev

在python中获取具有最高值的元素

来自分类Dev

在 SQL 中查找具有最高值的行

来自分类Dev

Java:在HashMap中获取2个最高值的索引

来自分类Dev

以元组为键的字典中具有最高值的前n个键

来自分类Dev

从SQL Server查询Python中的二进制值

来自分类Dev

在javascript中创建一个具有随机二进制值(0,1)的数组

来自分类Dev

输出具有最高值的列名

来自分类Dev

插入具有最高值的列的列名

来自分类Dev

将列中的 CSV 值转换为具有二进制答案的单独列

来自分类Dev

C#获取二进制搜索以显示数组中的所有重复值

来自分类Dev

SQL:从子查询返回具有最高值的列名称

来自分类Dev

获取特定列中具有最高值的不同值

来自分类Dev

在arraylist中获得前3个最高值?

来自分类Dev

从二进制文件中获取C中变量的十六进制值

来自分类Dev

第二和第三张表中具有最高值的行

来自分类Dev

第二和第三张表中具有最高值的行

来自分类Dev

从数组列表中返回具有最高值的对象?

来自分类Dev

查找R中具有最高值的向量

来自分类Dev

获取ndarray中N个最高值的索引

来自分类Dev

从两个文件中获取最高值

来自分类Dev

获取numpy数组中N个最高值的索引

来自分类Dev

从MATLAB中的二进制向量(0,1)中选择1个值的前n个

来自分类Dev

R-基于Data.table快速二进制搜索的子集,在第二个键中具有多个值

来自分类Dev

从二进制数中获取最后5个二进制位?

来自分类Dev

从Perl中的二进制文件获取十进制值

来自分类Dev

获取具有最高值的变量并将该变量的名称插入输入中

Related 相关文章

  1. 1

    获取Javascript中具有最高值的前十个var

  2. 2

    我必须在oracle的一行中显示具有最高值的列名

  3. 3

    获取ArrayList中具有最高值的特定元素

  4. 4

    在python中获取具有最高值的元素

  5. 5

    在 SQL 中查找具有最高值的行

  6. 6

    Java:在HashMap中获取2个最高值的索引

  7. 7

    以元组为键的字典中具有最高值的前n个键

  8. 8

    从SQL Server查询Python中的二进制值

  9. 9

    在javascript中创建一个具有随机二进制值(0,1)的数组

  10. 10

    输出具有最高值的列名

  11. 11

    插入具有最高值的列的列名

  12. 12

    将列中的 CSV 值转换为具有二进制答案的单独列

  13. 13

    C#获取二进制搜索以显示数组中的所有重复值

  14. 14

    SQL:从子查询返回具有最高值的列名称

  15. 15

    获取特定列中具有最高值的不同值

  16. 16

    在arraylist中获得前3个最高值?

  17. 17

    从二进制文件中获取C中变量的十六进制值

  18. 18

    第二和第三张表中具有最高值的行

  19. 19

    第二和第三张表中具有最高值的行

  20. 20

    从数组列表中返回具有最高值的对象?

  21. 21

    查找R中具有最高值的向量

  22. 22

    获取ndarray中N个最高值的索引

  23. 23

    从两个文件中获取最高值

  24. 24

    获取numpy数组中N个最高值的索引

  25. 25

    从MATLAB中的二进制向量(0,1)中选择1个值的前n个

  26. 26

    R-基于Data.table快速二进制搜索的子集,在第二个键中具有多个值

  27. 27

    从二进制数中获取最后5个二进制位?

  28. 28

    从Perl中的二进制文件获取十进制值

  29. 29

    获取具有最高值的变量并将该变量的名称插入输入中

热门标签

归档