SQL — 获取 A 列日期与 B 列日期相差 7 天的所有行

Posted

技术标签:

【中文标题】SQL — 获取 A 列日期与 B 列日期相差 7 天的所有行【英文标题】:SQL — get all rows where column A's date is a multiple of 7 days apart from column B's date 【发布时间】:2020-11-01 21:17:02 【问题描述】:
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 月 1 日的开始日期和 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】:

您只需要差值和模函数。

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

【讨论】:

@MichaelHauptmann 。 . .索引不太可能有助于此查询。假设日期是均匀分布的,查询将检索大约七分之一的行——因此它的选择性不高。

以上是关于SQL — 获取 A 列日期与 B 列日期相差 7 天的所有行的主要内容,如果未能解决你的问题,请参考以下文章

SQL where 日期列比另一个日期列大至少 20 天

如何使用 SQL 获取 2 列之间日期差异的计数(值的分布)?

SQL Select:获取列中的上一个日期

如何在 Oracle SQL 中使用月份作为日期列

js 两个日期间隔月数

Python sqlite3 SQL查询获取具有最新日期但每个唯一列限制的所有条目