Oracle SQL – DENSE_RANK
发布时间:2021-01-11 17:26:07 所属栏目:站长百科 来源:网络整理
导读:我有一个客户数据表,其选定列如下所示: Row_ID Client_ID Status_ID From_date To_date 1 123456 4 20/12/2007 18:02 20/12/2007 18:07 2 789087 4 20/12/2007 18:02 20/12/2007 18:07 3 789087 4 20/12/2007 18:07 20/12/2007 18:50 4 789087 4 20/12/2007
我有一个客户数据表,其选定列如下所示: Row_ID Client_ID Status_ID From_date To_date 1 123456 4 20/12/2007 18:02 20/12/2007 18:07 2 789087 4 20/12/2007 18:02 20/12/2007 18:07 3 789087 4 20/12/2007 18:07 20/12/2007 18:50 4 789087 4 20/12/2007 18:50 21/12/2007 10:38 5 123456 4 20/12/2007 18:07 20/12/2007 18:50 6 123456 4 20/12/2007 18:50 21/12/2007 10:38 7 123456 4 21/12/2007 10:38 21/12/2007 16:39 8 789087 4 21/12/2007 10:38 21/12/2007 17:54 9 789087 4 21/12/2007 17:54 21/12/2007 18:32 10 789087 4 21/12/2007 18:32 22/12/2007 06:48 11 123456 5 21/12/2007 16:39 12 789087 5 22/12/2007 06:48 22/12/2007 10:53 13 789087 4 22/12/2007 10:53 22/12/2007 11:51 14 789087 5 22/12/2007 11:51 在通过Client_ID然后通过From_date将数据按升序排列之后,我的目标是在每次将状态与前一行进行比较时,该客户端的状态发生变化时添加计算的Rank_ID.我想要的Rank_ID所需的值如下所示: Row_ID Client_ID Status_ID From_date To_date Rank_ID 1 123456 4 20/12/2007 18:02 20/12/2007 18:07 1 5 123456 4 20/12/2007 18:07 20/12/2007 18:50 1 6 123456 4 20/12/2007 18:50 21/12/2007 10:38 1 7 123456 4 21/12/2007 10:38 21/12/2007 16:39 1 11 123456 5 21/12/2007 16:39 2 2 789087 4 20/12/2007 18:02 20/12/2007 18:07 3 3 789087 4 20/12/2007 18:07 20/12/2007 18:50 3 4 789087 4 20/12/2007 18:50 21/12/2007 10:38 3 8 789087 4 21/12/2007 10:38 21/12/2007 17:54 3 9 789087 4 21/12/2007 17:54 21/12/2007 18:32 3 10 789087 4 21/12/2007 18:32 22/12/2007 06:48 3 12 789087 5 22/12/2007 06:48 22/12/2007 10:53 4 13 789087 4 22/12/2007 10:53 22/12/2007 11:51 5 14 789087 5 22/12/2007 11:51 6 我试图使用DENSE_RANK作为分析函数,我的“不正确”SQL代码在下面 SELECT t1.*,DENSE_RANK () OVER (ORDER BY t1.client_id,t1.status_id) rank_id FROM (SELECT c.client_ID,c.status_id,c.from_date,c.to_date FROM client c ORDER BY c.client_id,c.from_date) t1 ORDER BY t1.client_id,t1.from_date 但是,我遇到的问题是它给出了编写的SQL代码,它按如下方式计算Rank_ID: Row_ID Client_ID Status_ID From_date To_date Rank_ID 1 123456 4 20/12/2007 18:02 20/12/2007 18:07 1 5 123456 4 20/12/2007 18:07 20/12/2007 18:50 1 6 123456 4 20/12/2007 18:50 21/12/2007 10:38 1 7 123456 4 21/12/2007 10:38 21/12/2007 16:39 1 11 123456 5 21/12/2007 16:39 2 2 789087 4 20/12/2007 18:02 20/12/2007 18:07 3 3 789087 4 20/12/2007 18:07 20/12/2007 18:50 3 4 789087 4 20/12/2007 18:50 21/12/2007 10:38 3 8 789087 4 21/12/2007 10:38 21/12/2007 17:54 3 9 789087 4 21/12/2007 17:54 21/12/2007 18:32 3 10 789087 4 21/12/2007 18:32 22/12/2007 06:48 3 12 789087 5 22/12/2007 06:48 22/12/2007 10:53 4 13 789087 4 22/12/2007 10:53 22/12/2007 11:51 3 14 789087 5 22/12/2007 11:51 4 对于记录13,返回的Rank_ID是3(而我想要的是5表示该客户端的状态随该客户端的前一记录的状态而变化)而对于记录14,返回的Rank_ID为4,而我想要6,因为与前一行相比,该客户的状态发生了变化. 我想问题是我的SQL通过Client_ID然后通过Status_ID对数据进行排序,因此我可以看出为什么它会产生它给出的答案.问题是无论我对DENSE_RANK行做了什么改变,我都无法得到我想要的答案. 任何帮助,将不胜感激. 解决方法据我所知,这就是你所需要的:select client_ID,status_id,from_date,to_date,sum(start_of_group) over (order by client_ID,from_date) + 1 rank from (SELECT c.client_ID,c.to_date,case when lag(c.client_ID,1,c.client_ID) over (order by c.client_ID,c.from_date) = c.client_ID and lag(c.status_id,c.status_id) over (order by c.client_ID,c.from_date) = c.status_id then 0 else 1 end start_of_group FROM client c) order by client_ID,from_date SQLFiddle (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐
热点阅读