Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-具有稠密_秩()的窗口函数_Sql_Hive - Fatal编程技术网

SQL-具有稠密_秩()的窗口函数

SQL-具有稠密_秩()的窗口函数,sql,hive,Sql,Hive,我在Hive中存储了一个结构化的数据集,如下所示,称之为df: +-----+-----+----------+--------+ | id1 | id2 | date | amount | +-----+-----+----------+--------+ | 1 | 2 | 11-07-17 | 0.93 | | 2 | 2 | 11-11-17 | 1.94 | | 2 | 2 | 11-09-17 | 1.90 | | 1 | 1 |

我在Hive中存储了一个结构化的数据集,如下所示,称之为df:

+-----+-----+----------+--------+
| id1 | id2 |   date   | amount |
+-----+-----+----------+--------+
|   1 |   2 | 11-07-17 | 0.93   |
|   2 |   2 | 11-11-17 | 1.94   |
|   2 |   2 | 11-09-17 | 1.90   |
|   1 |   1 | 11-10-17 | 0.33   |
|   2 |   2 | 11-10-17 | 1.93   |
|   1 |   1 | 11-07-17 | 0.25   |
|   1 |   1 | 11-09-17 | 0.33   | 
|   1 |   1 | 11-12-17 | 0.33   |
|   2 |   2 | 11-08-17 | 1.90   |
|   1 |   1 | 11-08-17 | 0.30   |
|   2 |   2 | 11-12-17 | 2.01   |
|   1 |   2 | 11-12-17 | 1.00   |
|   1 |   2 | 11-09-17 | 0.94   |
|   2 |   2 | 11-07-17 | 1.94   |
|   1 |   2 | 11-11-17 | 1.92   |
|   1 |   1 | 11-11-17 | 0.33   |
|   1 |   2 | 11-10-17 | 1.92   |
|   1 |   2 | 11-08-17 | 0.94   |
+-----+-----+----------+--------+
我希望按id1和id2划分,然后在id1和id2的每个分组中按日期降序,然后在其中排列“金额”,连续几天相同的“金额”将获得相同的排名。我希望看到的排序输出如下所示:

+-----+-----+------------+--------+------+
| id1 | id2 |    date    | amount | rank |
+-----+-----+------------+--------+------+
|   1 |   1 | 2017-11-12 | 0.33   |    1 |
|   1 |   1 | 2017-11-11 | 0.33   |    1 |
|   1 |   1 | 2017-11-10 | 0.33   |    1 |
|   1 |   1 | 2017-11-09 | 0.33   |    1 |
|   1 |   1 | 2017-11-08 | 0.30   |    2 |
|   1 |   1 | 2017-11-07 | 0.25   |    3 |
|   1 |   2 | 2017-11-12 | 1.00   |    1 |
|   1 |   2 | 2017-11-11 | 1.92   |    2 |
|   1 |   2 | 2017-11-10 | 1.92   |    2 |
|   1 |   2 | 2017-11-09 | 0.94   |    3 |
|   1 |   2 | 2017-11-08 | 0.94   |    3 |
|   1 |   2 | 2017-11-07 | 0.93   |    4 |
|   2 |   2 | 2017-11-12 | 2.01   |    1 |
|   2 |   2 | 2017-11-11 | 1.94   |    2 |
|   2 |   2 | 2017-11-10 | 1.93   |    3 |
|   2 |   2 | 2017-11-09 | 1.90   |    4 |
|   2 |   2 | 2017-11-08 | 1.90   |    4 |
|   2 |   2 | 2017-11-07 | 1.94   |    5 |
+-----+-----+------------+--------+------+
我尝试使用以下SQL查询执行此操作:

SELECT 
    id1, 
    id2, 
    date, 
    amount,
    dense_rank() OVER (PARTITION BY id1, id2 ORDER BY date DESC) AS rank
FROM
    df
GROUP BY
    id1,
    id2,
    date,
    amount
但是这个查询似乎没有达到我希望的效果,因为我没有收到我想要的输出


我需要的似乎是一个使用稠密秩、分区和排序的窗口函数,但我似乎无法让它提供我想要的样本输出。任何帮助都将不胜感激!谢谢

这相当棘手。我认为您需要使用
lag()
查看值的变化,然后进行累积求和:

select df.*,
       sum(case when prev_amount = amount then 0 else 1 end) over
           (partition by id1, id2 order by date desc) as rank
from (select df.*,
             lag(amount) over (partition by id1, id2 order by date desc) as prev_amount
      from df
     ) df;

复杂的是“在连续的几天内”,到目前为止,您的代码并没有尝试适应这一点,mmmwouldn_rank()是否为id1、id2和amount的连续组合提供相同的排名?这正是我想要的-对窗口函数来说相对较新,所以我的解释可能不正确。你按日期排序,而不是数量,所以它是按日期变化排序的,你想要的是相似的数量,以获得相同的排名,最后的结果行可以按日期排序。我不确定这是否适用于我的用例——这样做的话,第14行和第18行不会得到相同的排名吗?当我需要它们分别排名2和5时,稠密的_rank()是一个分析函数。非常好的解决方案。在您的选择中,只有一个应该更改为“按日期排序描述”(ORDER BY date DESC)为rank@PhamX.Bach。非常感谢。