繁体   English   中英

按日期排序的 SQL 中的排名

[英]Rank in SQL ordered by date

我正在尝试创建一个由 2 列分区并按时间顺序排序的排名。

这是我的原始表格,带有公司类别的每日表格。

create table T1
(
    observation_date date,
    company_id varchar(16383),
    company_category varchar(16383)
);

insert into T1 values (company_id, calendar_date, company_category) 
                        ('aaaa', '2020-01-31', 'new');
                        ('aaaa', '2020-02-01', 'new');
                        ('aaaa', '2020-02-02', 'new');
                        ('aaaa', '2020-02-03', 'new')
                        ('aaaa', '2020-08-20', 'converted');
                        ('aaaa', '2020-08-21', 'big');
                        ('aaaa', '2020-08-22', 'big');
                        ('cccc', '2020-12-02', 'new');
                        ('cccc', '2020-12-03', 'converted');
                        ('cccc', '2020-12-04', 'big');
                        ('aaaa', '2020-09-18', 'converted');
                        ('aaaa', '2020-09-19', 'converted');

我想按时间顺序根据公司及其类别创建排名。 如果在某个时候,一家公司获得了以前的类别,只要中间有另一个类别,排名仍然会增加(参见“2020-08-20”和“2018-06-18”的公司aaaa

create table T2
(
    observation_date date,
    company_id varchar(16383),
    company_category varchar(16383),
    ranked integer
);
insert into T2 values (company_id, calendar_date, company_category, ranked) 
                        ('aaaa', '2020-01-31', 'new', 1);
                        ('aaaa', '2020-02-01', 'new', 1);
                        ('aaaa', '2020-02-02', 'new', 1);
                        ('aaaa', '2020-02-03', 'new', 1);
                        ('aaaa', '2020-08-20', 'converted', 2);
                        ('aaaa', '2020-08-21', 'big', 3);
                        ('aaaa', '2020-08-22', 'big', 3);
                        ('cccc', '2020-12-02', 'new', 1);
                        ('cccc', '2020-12-03', 'converted', 2);
                        ('cccc', '2020-12-04', 'big', 3);
                        ('aaaa', '2020-09-18', 'converted', 4);
                        ('aaaa', '2020-09-19', 'converted', 4);

无法解决如何使其工作的问题。 我试过做:

rank() over (partition by company_id,company_category order by calendar_date)

但是随后在 order 子句中使用 calendar_date 创建每个日期的唯一排名,并在每个分区上重新启动。

dense_rank() over (partition by company_id order by company_category)

越来越近了,但按company_category排序的顺序是按时间顺序排列的。

任何提示表示赞赏。 先感谢您!

RANK不起作用。 您需要通过比较当前值与先前值来跟踪类别的变化; 然后对行进行编号,以便每次更改时数字都会增加。 就像是:

WITH cte AS (
    SELECT *
         , CASE WHEN company_category = LAG(company_category) OVER (PARTITION BY company_id ORDER BY observation_date) THEN 0 ELSE 1 END AS changed
    FROM t1
)
SELECT *
     , SUM(changed) OVER (PARTITION BY company_id ORDER BY observation_date) AS ranked
FROM cte
ORDER BY company_id, observation_date

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM