gpt4 book ai didi

sql - sql连续几天

转载 作者:行者123 更新时间:2023-11-29 11:22:18 27 4
gpt4 key购买 nike

我发现了很多关于连续几天的 stackoverflow QnA。
答案仍然太短,我无法理解发生了什么。

为了具体起见,我将制作一个模型(或表格)
(如果它有所作为,我正在使用 postgresql。)

CREATE TABLE work (
id integer NOT NULL,
user_id integer NOT NULL,
arrived_at timestamp with time zone NOT NULL
);


insert into work(user_id, arrived_at) values(1, '01/03/2011');
insert into work(user_id, arrived_at) values(1, '01/04/2011');
  1. (以最简单的形式)对于给定的用户,我想找到最后一个连续的日期范围。

  2. (我的最终目标)对于给定的用户,我想找到他的连续工作日。
    如果他昨天来上类,他仍然(截至今天)有机会连续工作几天。所以我给他看了连续几天到昨天。
    但如果他昨天没来,他的连续天数要么是 0 要么是 1,这取决于他今天来不来。

假设今天是第 8 天。

3 * 5 6 7 * = 3 days (5 to 7)
3 * 5 6 7 8 = 4 days (5 to 8)
3 4 5 * 7 * = 1 day (7 to 7)
3 * * * * * = 0 day
3 * * * * 8 = 1 day (8 to 8)

最佳答案

这是我使用 CTE 解决这个问题的方法

WITH RECURSIVE CTE(attendanceDate)
AS
(
SELECT * FROM
(
SELECT attendanceDate FROM attendance WHERE attendanceDate = current_date
OR attendanceDate = current_date - INTERVAL '1 day'
ORDER BY attendanceDate DESC
LIMIT 1
) tab
UNION ALL

SELECT a.attendanceDate FROM attendance a
INNER JOIN CTE c
ON a.attendanceDate = c.attendanceDate - INTERVAL '1 day'
)
SELECT COUNT(*) FROM CTE;

检查 SQL Fiddle 处的代码

下面是查询的工作原理:

  1. 它从attendance 表中选择今天的记录。如果今天的记录不可用,则选择昨天的记录
  2. 然后在最短日期前一天递归添加记录

如果您想选择最新的连续日期范围,而不管用户最近一次出勤是什么时候(今天、昨天或 x 天前),则 CTE 的初始化部分必须替换为以下代码段:

SELECT MAX(attendanceDate) FROM attendance

[编辑]这是 SQL Fiddle 上的查询,它解决了您的问题#1:SQL Fiddle

关于sql - sql连续几天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22142028/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com