【问题标题】:How to use rank in sql but order by where filed equals to a constant如何在 sql 中使用排名,但按字段排序等于常量
【发布时间】:2017-05-02 22:03:44
【问题描述】:

我的数据集是这样的。我有 customerid 和程序名称。
一个客户可以有多个程序名称。我想按 customerId 和 ORDER BY 程序名称对数据和 PARTITION 进行排名。但我想给一个特定的程序'abc'排名第一。然后我可以只选择排名第一并删除重复项。

有没有办法根据 where program 等于 'abc' 进行排名和排序?

【问题讨论】:

  • 这看起来是一个有趣的问题 - 但是 - 到目前为止,您尝试了什么?请编辑您的问题以显示您遇到问题的代码的Minimal, Complete, and Verifiable example,然后我们可以尝试帮助解决具体问题。你也可以阅读How to Ask。如果,至少,您可以添加输入数据和所需结果的示例 - 这将在几分钟内完成!
  • 当然让我更新一下
  • 我根据我对您问题的理解继续前进 - 查看答案

标签: sql google-bigquery


【解决方案1】:

我想按我想要的客户对数据和分区进行排名,并按程序名称排序。但我想给一个特定的程序'abc'排名第一。

假设程序名称不能为 NULL - 下面应该可以解决问题

SELECT customerid, program, 
RANK() OVER(PARTITION BY customerid ORDER BY IF(program = 'abc', NULL, program)) AS rnk
FROM yourTable

您可以如下测试/玩虚拟数据

#standardSQL
WITH yourTable AS (
  SELECT pair.customerid, pair.program
  FROM UNNEST([STRUCT<customerid INT64, program STRING>
    (1,'aaa'), (1, 'p2'), (1, 'abc'), (1, 'p3'), 
    (2,'x7'), (2, 'aba'), (2, 'abc'), (2, 'x4')
  ]) AS pair
)
SELECT customerid, program, 
RANK() OVER(PARTITION BY customerid ORDER BY IF(program = 'abc', NULL, program)) AS rnk
FROM yourTable
ORDER BY customerid, rnk   

结果将是

customerid  program rnk  
1           abc     1    
1           aaa     2    
1           p2      3    
1           p3      4    
2           abc     1    
2           aba     2    
2           x4      3    
2           x7      4    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2018-08-01
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多