【问题标题】:How to rank subsequent data with gaps如何对有差距的后续数据进行排名
【发布时间】:2019-03-25 13:32:50
【问题描述】:

我有这张表,我想对 plan_number 列进行排名和更新。 使用 DENSE_RANK 我已经成功地对大部分数据进行了分组,但是一些帐户在间隔前后的数量相同,它们将被分组在一起。

CREATE TABLE dbo.PlanItem(
    plan_account                INT
,   plan_sequence               INT
,   plan_number                 INT
,   plan_amount                 DECIMAL(16,2)                               
,   plan_due_date               DATETIME                                            
    )

INSERT INTO dbo.PlanItem VALUES(12159875,1223931,0,9334.00,'2014-07-31')
INSERT INTO dbo.PlanItem VALUES(12159875,1223932,0,160584.00,'2014-08-31')
INSERT INTO dbo.PlanItem VALUES(12159875,1223933,0,9334.00,'2014-09-30')
INSERT INTO dbo.PlanItem VALUES(12159875,1223934,0,9334.00,'2014-10-31')
INSERT INTO dbo.PlanItem VALUES(12159875,1223935,0,9334.00,'2014-11-30')
INSERT INTO dbo.PlanItem VALUES(12159875,1223936,0,9334.00,'2014-12-31')
INSERT INTO dbo.PlanItem VALUES(12159875,1223937,0,9334.00,'2015-01-31')
INSERT INTO dbo.PlanItem VALUES(12159875,1223938,0,9334.00,'2015-02-28')
INSERT INTO dbo.PlanItem VALUES(12159875,1223939,0,9334.00,'2015-03-31')

我希望这张表的排名如下:

12159875,1223931,1,9334.00,'2014-07-31'
12159875,1223932,2,160584.00,'2014-08-31'
12159875,1223933,3,9334.00,'2014-09-30'
12159875,1223934,3,9334.00,'2014-10-31'
12159875,1223935,3,9334.00,'2014-11-30'
12159875,1223936,3,9334.00,'2014-12-31'
12159875,1223937,3,9334.00,'2015-01-31'
12159875,1223938,3,9334.00,'2015-02-28'
12159875,1223939,3,9334.00,'2015-03-31'

分组应基于相同的后续plan_amounts。 并按照从低到高的plan_sequence 排序最旧到最新的操作系统。

我尝试了一个简单的 DENS_RANK,它适用于大多数数据。 但是当数据有上限并且上限前后的数据相同时,它们将被分组在一起。

WITH CTE_TEST
AS
(
SELECT *,
    DENSE_RANK() OVER (PARTITION BY plan_account ORDER BY plan_amount) AS Dense
FROM dbo.PlanItem
)

UPDATE dbo.PlanItem 
SET plan_number = Dense
FROM CTE_TEST
JOIN dbo.PlanItem ON dbo.PlanItem.plan_sequence = CTE_TEST.plan_sequence
GO

这是 select * from dbo.PlanItem order by plan_account 的输出

12159875,1223933,1,9334.00,'2014-09-30'
12159875,1223934,1,9334.00,'2014-10-31'
12159875,1223935,1,9334.00,'2014-11-30'
12159875,1223936,1,9334.00,'2014-12-31'
12159875,1223937,1,9334.00,'2015-01-31'
12159875,1223938,1,9334.00,'2015-02-28'
12159875,1223939,1,9334.00,'2015-03-31'
12159875,1223931,1,9334.00,'2014-07-31'
12159875,1223932,2,160584.00,'2014-08-31'

【问题讨论】:

  • 我在这里实际上没有看到问题陈述。您的查询背后的逻辑是什么,排名代表什么?

标签: sql sql-server multiple-columns rank subsequence


【解决方案1】:

这是一种孤岛问题。

为此,使用lag() 在前一个值处达到峰值,然后进行条件累积和:

select pi.*,
       sum(case when prev_pa = plan_amount then 0 else 1 end) over (partition by plan_account order by plan_sequence) as your_rank
from (select pi.*, lag(plan_amount) over (partition by plan_account order by plan_sequence) as prev_pa
      from planitem pi
     ) pi;

Here 是一个 dbfiddle。请注意,这里使用的是 SQL Server,它与您的语法一致,但与标签不一致。

【讨论】:

  • 谢谢戈登。这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多