SQL-具有稠密_秩()的窗口函数
我在Hive中存储了一个结构化的数据集,如下所示,称之为df: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 |
+-----+-----+----------+--------+
| 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。非常感谢。