如何在sql中使用rank但按where where等于常量的顺序

时间:2017-05-02 22:03:44

标签: sql google-bigquery

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

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

1 个答案:

答案 0 :(得分: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