在分区上的rank(),把所有东西都指定为1

emeijp43  于 2021-04-21  发布在  Hive
关注(0)|答案(2)|浏览(715)

我试图对一个数据集进行排序,以确定一个账户号码每天出现的次数,这样我就可以根据次数采取相应的措施。
我的数据显示如下。

+---------------+-----------+-----------+------------------+-----------+---------------+-----------+-----------+-----------+-------------+
| accountnumber | ctry_code | prod_code | comm_file_postdt |  post_dt  | comm_file_pay |  payment  | comm_diff | days_diff | mindue_diff |
+---------------+-----------+-----------+------------------+-----------+---------------+-----------+-----------+-----------+-------------+
|          1234 | MX        | PR        | 6/29/2020        | 6/26/2020 |        -583.5 |    -583.5 |      0.01 |       105 |             |
|          1234 | MX        | PR        | 6/29/2020        | 6/27/2020 |       -443.85 |   -443.85 |      0.01 |       138 |             |
|          1234 | MX        | GL        | 6/30/2020        | 6/26/2020 |      -2783.25 |  -2783.25 |      0.01 |       141 |             |
|          1234 | MX        | OP        | 6/30/2020        | 6/26/2020 |         -4000 |     -4000 |      0.01 |        57 |           0 |
|          1235 | MX        | OP        | 6/29/2020        | 6/27/2020 |      -3794.65 |  -3794.65 |    -35.84 |       102 |         239 |
|          1236 | MX        | OP        | 6/29/2020        | 6/27/2020 |          -239 |      -239 |     35.85 |       102 |      -537.5 |
|          1237 | MX        | OP        | 6/29/2020        | 6/27/2020 |       -345.67 |   -345.67 |    -34.57 |        38 |      345.67 |
|          1238 | MX        | OP        | 6/29/2020        | 6/26/2020 |         -3000 |     -3000 |    371.91 |        63 |     -2479.4 |
|          1238 | MX        | OP        | 6/29/2020        | 6/26/2020 |       -1661.5 |   -1661.5 |      0.01 |        41 |   -11950.16 |
|          1238 | MX        | OP        | 6/29/2020        | 6/27/2020 |     -15466.24 | -15466.24 |  -1091.34 |        12 |    10913.46 |
+---------------+-----------+-----------+------------------+-----------+---------------+-----------+-----------+-----------+-------------+

我想做的是对每个单独的comm_file_postdt的每个账号进行排序。
基于下面的表格,我的预期结果将是:。

+---------------+------------------+------+
| accountnumber | comm_file_postdt | rank |
+---------------+------------------+------+
|          1234 | 6/29/2020        |    1 |
|          1234 | 6/29/2020        |    2 |
|          1234 | 6/30/2020        |    1 |
|          1234 | 6/30/2020        |    2 |
|          1235 | 6/29/2020        |    1 |
|          1236 | 6/29/2020        |    1 |
|          1237 | 6/29/2020        |    1 |
|          1238 | 6/29/2020        |    1 |
|          1238 | 6/29/2020        |    2 |
|          1238 | 6/29/2020        |    3 |
+---------------+------------------+------+

然而,我在每一次迭代中得到的排名都是1。
我已经做了以下工作。

Select *,
rank() over(partition by accountnumber order by comm_file_postdt) as rank from tableA

select*,
rank() over(partition by accountnumber, comm_file_postdt order by post_dt) as rank from tableA

以及其他一些方法,但无论我如何尝试分区和顺序中的任何数值组合,我都得到了所有的排名为1。
任何关于我可能做错了什么的指导将是非常有用的。

jjhzyzn0

jjhzyzn01#

这是你的代码。

rank() over(partition by accountnumber order by comm_file_postdt)

你的数据中有多条具有相同 "accountnumber "和 "comm_file_postdt "的记录:这些是并列的,所以rank()给它们分配相同的值。
最干净的解决方案是使用另一列来打破联系 - 可能是post_dt

rank() over(partition by accountnumber order by comm_file_postdt, post_dt)

或者你可以使用row_number(),这样可以保证没有重复。然而,如果没有一个确定的order by子句,就不能确定哪条并列的行会被排在第一位:这可能是,也可能不是你想要的。

row_number() over(partition by accountnumber order by comm_file_postdt)
2mbi3lxu

2mbi3lxu2#

如果你想知道有多少次,你可能要找的是row_number()。

  • 示例代码 *
;with mycte as 
(
select 

1234 as account_number ,'6/29/2020' as comm_file_postdt     
union all select 
           1234 ,  '6/29/2020'   
           union all select 
           1234 ,  '6/30/2020'
           union all select 
           1234 ,  '6/30/2020'  
           union all select 
           1235 ,  '6/29/2020'  
           union all select 
           1236 ,  '6/29/2020'  
           union all select 
           1237 ,  '6/29/2020'  
           union all select 
           1238 ,  '6/29/2020'  
           union all select 
           1238 ,  '6/29/2020' 
           union all select 
           1238 ,  '6/29/2020' 
           )

           Select *, row_number() over (partition by account_number,comm_file_postdt order by comm_file_postdt) as [rank]

           from mycte

结果

相关问题