在按日期排序的 SQL 中排名
Rank in SQL ordered by date
我正在尝试创建一个按 2 列划分并按时间顺序排序的排名。
这是我的原创table,每日table公司类别。
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');
我想根据公司及其类别按时间顺序创建排名。如果在某个时候一家公司获得了它以前拥有的类别,只要中间有另一个类别,排名仍会增加(请参阅公司 aaaa
上的 '2020-08-20' 和 '2018-06-18' .
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
我正在尝试创建一个按 2 列划分并按时间顺序排序的排名。
这是我的原创table,每日table公司类别。
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');
我想根据公司及其类别按时间顺序创建排名。如果在某个时候一家公司获得了它以前拥有的类别,只要中间有另一个类别,排名仍会增加(请参阅公司 aaaa
上的 '2020-08-20' 和 '2018-06-18' .
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