查询以在记录“开始”和“停止”日期的表中查找给定日期的活动记录

菲利普

我在一个表中记录了一个“开始/停止”活动列表,每个活动都与一个日期关联。我需要确定在特定日期“启动”了哪些用户-即正在进行任务。我当前的设置和查询可以通过以下简单视图表示:

CREATE TABLE `registration_statuses` (
    `status_id` INT(11) NOT NULL AUTO_INCREMENT,
    `status_user_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
    `status_activity` ENUM('start','stop') DEFAULT 'start',
    `status_date` DATE NULL DEFAULT NULL,
    PRIMARY KEY (`status_id`),
    INDEX `status_user_id` (`status_user_id`)
);

INSERT INTO `registration_statuses` (`status_user_id`, `status_activity`, `status_date`)
VALUES (1, 'start', '2020-01-01'),
       (2, 'start', '2020-01-02'),
       (1, 'stop', '2020-01-19'),
       (1, 'start', '2020-01-25'),
       (2, 'stop', '2020-01-31'),
       (1, 'stop', '2020-01-31');

然后,我正在运行此查询:

SELECT `rs`.`status_user_id`
FROM `registration_statuses` `rs`
  INNER JOIN (
    SELECT `status_user_id`, MAX(status_date) `last_date`
    FROM `registration_statuses`
    WHERE `status_date` < '2020-01-03'
    GROUP BY `status_user_id`
  ) `srs` ON `rs`.`status_user_id` = `srs`.`status_user_id`
            AND `rs`.`status_date` = `srs`.`last_date`
WHERE `status_activity` = 'start';

(请参阅http://sqlfiddle.com/#!9/c8d371/1/0

通过更改查询中的日期,此查询返回一个用户ID列表,该ID告诉我在该特定日期谁在从事(即开始一项任务)。但是,用户(在现实生活中)被认为在他们停止任务的实际日期参与了该任务。此查询不允许这样做,因为如果您要更改查询中的日期以反映2020-01-19(用户1停止的那一天),则查询将仅返回用户2。

我尝试将<=条件更改为strict <,虽然这解决了部分问题,但用户在开始的那一天就不会被认为很忙。使用strict <,只有用户在'2019-01-25'返回,而我希望两个用户都出现。

此时,我唯一的“可行”解决方案是合并两个版本的查询结果(以DISTINCT/ UNIONquery的形式),但我不禁认为必须有一种更有效的方法获得我需要的结果。

草莓

这有帮助吗?

SELECT a.status_id
     , a.status_user_id 
     , a.status_date start
     , MIN(b.status_date) stop
  FROM registration_statuses a
  LEFT
  JOIN registration_statuses b
    ON b.status_user_id = a.status_user_id
   AND b.status_id > a.status_id
   AND b.status_activity = 'stop'
 WHERE a.status_activity = 'start'
 GROUP 
    BY a.status_id;

+-----------+----------------+------------+------------+
| status_id | status_user_id | start      | stop       |
+-----------+----------------+------------+------------+
|         1 |              1 | 2020-01-01 | 2020-01-19 |
|         2 |              2 | 2020-01-02 | 2020-01-31 |
|         4 |              1 | 2020-01-25 | 2020-01-31 |
+-----------+----------------+------------+------------+

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

选择给定日期和日期之间的记录。

来自分类Dev

需要帮助才能在给定日期从2个以上的表中获取记录

来自分类Dev

需要帮助以在给定日期从2个以上的表中获取记录

来自分类Dev

如何从给定日期查找星期的开始日期?

来自分类Dev

如何在MySQL查询中获取具有最高日期作为给定日期的记录数

来自分类Dev

如何使用 dplyr 和 lubridate 包按一系列给定日期计算活动记录?

来自分类Dev

SQL:查找具有给定日期范围内每月数据的记录

来自分类Dev

查找距给定日期/时间戳最近的记录(之前或之后)

来自分类Dev

SQL:查找具有给定日期范围内每个月的数据的记录

来自分类Dev

返回给定日期内的所有记录

来自分类Dev

SQL从给定日期选择前3条记录

来自分类Dev

获取每个给定日期之前的雇员的最新记录

来自分类Dev

SQL从给定日期选择前3条记录

来自分类Dev

获取每个给定日期之前的雇员的最新记录

来自分类Dev

SQL-查询以返回给定日期的活动订阅

来自分类Dev

在Python中从给定日期查找日期

来自分类Dev

如何使用Jongo运行查询以获取给定日期之间的记录?

来自分类Dev

如何显示给定日期数组中显示活动和不活动的月份

来自分类Dev

仅显示MySQL中每条记录的最新给定日期

来自分类Dev

根据给定日期从列表中查找项目

来自分类Dev

获取给定日期范围内的月份的开始日期和结束日期

来自分类Dev

从查询中提取给定日期和SQL中公共值的行数据

来自分类Dev

获取一组记录与给定日期的最接近日期

来自分类Dev

如何使用C#检索给定日期(无论时间如何)的记录?

来自分类Dev

在给定日期时间之前查找列表中的最新日期时间

来自分类Dev

将日期和月份与给定日期分开

来自分类Dev

将日期和月份与给定日期分开

来自分类Dev

在给定日期之前查找“状态更改”的正确SQL查询是什么?

来自分类Dev

使用MS Access查询查找给定日期的下一次出现

Related 相关文章

  1. 1

    选择给定日期和日期之间的记录。

  2. 2

    需要帮助才能在给定日期从2个以上的表中获取记录

  3. 3

    需要帮助以在给定日期从2个以上的表中获取记录

  4. 4

    如何从给定日期查找星期的开始日期?

  5. 5

    如何在MySQL查询中获取具有最高日期作为给定日期的记录数

  6. 6

    如何使用 dplyr 和 lubridate 包按一系列给定日期计算活动记录?

  7. 7

    SQL:查找具有给定日期范围内每月数据的记录

  8. 8

    查找距给定日期/时间戳最近的记录(之前或之后)

  9. 9

    SQL:查找具有给定日期范围内每个月的数据的记录

  10. 10

    返回给定日期内的所有记录

  11. 11

    SQL从给定日期选择前3条记录

  12. 12

    获取每个给定日期之前的雇员的最新记录

  13. 13

    SQL从给定日期选择前3条记录

  14. 14

    获取每个给定日期之前的雇员的最新记录

  15. 15

    SQL-查询以返回给定日期的活动订阅

  16. 16

    在Python中从给定日期查找日期

  17. 17

    如何使用Jongo运行查询以获取给定日期之间的记录?

  18. 18

    如何显示给定日期数组中显示活动和不活动的月份

  19. 19

    仅显示MySQL中每条记录的最新给定日期

  20. 20

    根据给定日期从列表中查找项目

  21. 21

    获取给定日期范围内的月份的开始日期和结束日期

  22. 22

    从查询中提取给定日期和SQL中公共值的行数据

  23. 23

    获取一组记录与给定日期的最接近日期

  24. 24

    如何使用C#检索给定日期(无论时间如何)的记录?

  25. 25

    在给定日期时间之前查找列表中的最新日期时间

  26. 26

    将日期和月份与给定日期分开

  27. 27

    将日期和月份与给定日期分开

  28. 28

    在给定日期之前查找“状态更改”的正确SQL查询是什么?

  29. 29

    使用MS Access查询查找给定日期的下一次出现

热门标签

归档