SQL - вычесть элементы в столбце друг из друга на основе ранжирования во 2-м столбце и агрегирования по 3-му столбцу - PullRequest
0 голосов
/ 09 июля 2020
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 - но на данный момент в моем запросе это структура, с которой я работаю.

Для каждого пользователя я хочу вычесть дату с рейтингом 1 из даты с рейтингом 2. Итак, для пользователя A я хочу получите РАЗМЕР между 1/1 и 1/4. В идеале результат должен выглядеть так:

user | date_diff  | state
A.   | 3          | NY
B.   | 1          | CA

Конечная цель - получить среднее значение date_diff для каждой страны, усредненное по всем пользователям в этой стране.

1 Ответ

0 голосов
/ 09 июля 2020

Для этого примера данных один из способов сделать это - набрать 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   
...