SQL - 根据第 2 列中的排名并由第 3 列汇总,将列中的项目相互减去
SQL - subtract items in column from each other, based on ranking in 2nd column and aggregated by a 3rd column
CREATE TABLE table_1 (
`userid` VARCHAR(2),
`date_accessed` DATE,
`rank` INT,
`country` VARCHAR(2)
);
INSERT INTO table_1
(`userid`, `date_accessed`, `rank`, `country`)
VALUES
('A.', '2019-01-01', 1, 'US'),
('B.', '2019-01-02', 1, 'FR'),
('A.', '2019-01-03', 2, 'US'),
('A.', '2019-01-04', 3, 'US'),
('B.', '2019-01-04', 2, 'FR');
Fiddle: https://www.db-fiddle.com/f/caFeo5c4Try1q7FawHN7MC/1
我的数据集如下所示:
user | date | rank | state
A. |2020-01-01 | 1 | NY
A. |2020-01-04 | 2 | NY
A. |2020-01-08 | 3 | NY
B. |2020-01-01 | 1 | CA
B. |2020-01-02 | 2 | CA
B. |2020-01-04 | 3 | CA
这是一堆 WITH intermediate_table AS 语句的产物 — 但此时在我的查询中,这是我正在使用的结构。
对于每个用户,我想用排名第2的日期减去排名第1的日期。所以对于用户A,我想得到1/1和1/4之间的DATEDIFF。理想情况下,输出应如下所示:
user | date_diff | state
A. | 3 | NY
B. | 1 | CA
最终目标是获得每个国家/地区的平均值 date_diff,该国家/地区所有用户的平均值。
对于此示例数据,一种方法是 GROUP BY user, state
并使用条件聚合来减去日期:
SELECT
user,
DATEDIFF(
MAX(CASE WHEN `rank` = 2 THEN date END),
MAX(CASE WHEN `rank` = 1 THEN date END)
) date_diff,
state
FROM tablename
WHERE `rank` IN (1, 2)
GROUP BY user, state
参见demo。
结果:
> user | date_diff | state
> :--- | --------: | :----
> A. | 3 | NY
> B. | 1 | CA
CREATE TABLE table_1 (
`userid` VARCHAR(2),
`date_accessed` DATE,
`rank` INT,
`country` VARCHAR(2)
);
INSERT INTO table_1
(`userid`, `date_accessed`, `rank`, `country`)
VALUES
('A.', '2019-01-01', 1, 'US'),
('B.', '2019-01-02', 1, 'FR'),
('A.', '2019-01-03', 2, 'US'),
('A.', '2019-01-04', 3, 'US'),
('B.', '2019-01-04', 2, 'FR');
Fiddle: https://www.db-fiddle.com/f/caFeo5c4Try1q7FawHN7MC/1
我的数据集如下所示:
user | date | rank | state
A. |2020-01-01 | 1 | NY
A. |2020-01-04 | 2 | NY
A. |2020-01-08 | 3 | NY
B. |2020-01-01 | 1 | CA
B. |2020-01-02 | 2 | CA
B. |2020-01-04 | 3 | CA
这是一堆 WITH intermediate_table AS 语句的产物 — 但此时在我的查询中,这是我正在使用的结构。
对于每个用户,我想用排名第2的日期减去排名第1的日期。所以对于用户A,我想得到1/1和1/4之间的DATEDIFF。理想情况下,输出应如下所示:
user | date_diff | state
A. | 3 | NY
B. | 1 | CA
最终目标是获得每个国家/地区的平均值 date_diff,该国家/地区所有用户的平均值。
对于此示例数据,一种方法是 GROUP BY user, state
并使用条件聚合来减去日期:
SELECT
user,
DATEDIFF(
MAX(CASE WHEN `rank` = 2 THEN date END),
MAX(CASE WHEN `rank` = 1 THEN date END)
) date_diff,
state
FROM tablename
WHERE `rank` IN (1, 2)
GROUP BY user, state
参见demo。
结果:
> user | date_diff | state
> :--- | --------: | :----
> A. | 3 | NY
> B. | 1 | CA