SQL - получить все строки, в которых дата столбца A кратна 7 дням, кроме даты столбца B. - PullRequest
0 голосов
/ 12 июля 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'); 

Вот скрипка: https://www.db-fiddle.com/f/9F7XPiGtuQAYXQ99HfNJGN/0

А ниже - пример базы данных. Мне нужны все строки, в которых дата записи кратна 7 дням, кроме даты начала. Дата начала и даты записи не уникальны; он будет уникальным для каждой страны, но как в США, так и во Франции, например, даты начала могут быть 1 января, а даты записи - 8 января. В приведенной ниже таблице я хотел бы вытащить строки, где дата начала - 2019-01-01, а дата записи - 2019-01-08, например.


| start_date | num_people | record_date | rating | country |
| ---------- | ---------- | ----------- | ------ | ------- |
| 2019-01-01 | 275        | 2019-01-08  | 4      | FR      |
| 2019-01-02 | 150        | 2019-01-10  | 4      | FR      |
| 2019-01-03 | 175        | 2019-01-09  | 5      | FR      |
| 2019-01-04 | 300        | 2019-01-11  | 2      | FR      |
| 2019-01-01 | 100        | 2019-01-08  | 8.5    | US      |
| 2019-01-03 | 50         | 2019-01-10  | 5.5    | US      |
| 2019-01-03 | 50         | 2019-01-17  | 5      | US      |

---

Я хочу это сделать до 84 дней (каждые 7 дней / каждую неделю в течение 12 недель).

1 Ответ

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

Вам просто нужна разница и функция по модулю.

В MySQL:

select t.*
from t
where mod(datediff(record_date, start_date), 7) = 0;

В PrestoDB это будет:

where mod(date_diff('day', start_date, record_date), 7) = 0
...