mysql - 将 bool 值设置为 mysql 记录指示在所选时间戳范围之前是否存在其他记录

标签 mysql sql datetime count window-functions

基本表类似于:

mysqlTable:
          visitorID   ,park          ,DateTimeStamp
          8369        ,Birmingham    ,12/27/2018 03:26:38 PM
          8369        ,Birmingham    ,12/28/2018 11:27:32 AM
          8828        ,Central       ,01/02/2019 10:01
          8828        ,Central       ,01/04/2019 9:50
          8825        ,Central       ,12/21/2018 09:47:27 AM
          8821        ,Central       ,12/26/2018 10:11:40 AM
          8821        ,Central       ,02/03/2019 10:00:59 AM
          8821        ,Central       ,01/02/2019 10:04
          88281       ,Central       ,01/04/2019 9:53

根据这张表,我正在创建一个新表,我在其中计算特定公园的访客 ID,然后按访客 ID 和特定时间段内的访问日期对访问进行分组。

mysql query: 

SELECT COUNT(*)AS visits,dateTimeStamp,visitorID 
FROM parkVisits 
WHERE 
    dateTimeStamp BETWEEN '2019-01-01 00:00:01' AND '2019-01-04 23:59:59'
    AND park ='Central'
GROUP BY visitorID, CAST(dateTimeStamp AS DATE);

我的结果:

mysql table:

visits   ,dateTimeStamp     ,visitorID   
2        ,01/02/2019 10:01  ,8828      
1        ,01/02/2019 10:04  ,8821       
1        ,01/04/2019 9:53   ,88281      

我想要一个列,其中一个 bool 值指示访问者是否在指定日期它的行之前的任何时间访问过。 我正在考虑将表上最早的 dateTimeStamp 与最早给定日期进行比较,但可能会出现第一次访问和回访发生在给定时间段内的情况。

预期:

mysql table:

visits   ,dateTimeStamp   ,visitorID    ,returningVisitor
2        ,01/02/2019 10:01,  8828       ,TRUE
1        ,01/02/2019 10:04,  8821       ,FALSE
1        ,01/04/2019 9:53,   88281      ,FALSE

编辑:

我正在使用 MySQL 5.6.40

最佳答案

假设您正在运行 MySQL 8.0,您可以使用带有窗口函数的内部查询 FIRST_VALUE获取分析期间第一次访问的时间戳。然后在外部查询中,可以使用带有子查询的 EXISTS 子句来检查当前访问者之前是否曾经访问过同一个公园。

SELECT 
    x.visits,
    x.dateTimeStamp,
    x.visitorID,
    EXISTS (
        SELECT 1 FROM parkVisits WHERE park = x.park AND visitorID = x.visitorID AND dateTimeStamp < x.dateTimeStamp
    ) returningVisitor
FROM (
    SELECT DISTINCT
        COUNT(*) OVER (PARTITION BY p.visitorID) visits,
        FIRST_VALUE(p.dateTimeStamp) OVER (PARTITION BY p.visitorID ORDER BY p.dateTimeStamp) dateTimeStamp,
        p.visitorID,
        p.park
    FROM parkVisits p
    WHERE
        p.dateTimeStamp BETWEEN '2019-01-01 00:00:01' AND '2019-01-04 23:59:59' 
        AND p.park ='Central'
) x
ORDER BY 1 desc, 2

this db fiddle使用您的示例数据,它返回:

| visits | dateTimeStamp       | visitorID | returningVisitor |
| ------ | ------------------- | --------- | ---------------- |
| 2      | 2019-01-02 10:01:00 | 8828      | 0                |
| 1      | 2019-01-02 10:04:00 | 8821      | 1                |
| 1      | 2019-01-04 09:53:00 | 88281     | 0                |

注意:我认为回访者是 8821,而不是您问题中显示的 8828

如果您运行的是不支持窗口函数的较低版本的 MySQL,您可以在子查询中使用 GROUP BY 子句,例如:

SELECT 
    x.visits,
    x.dateTimeStamp,
    x.visitorID,
    EXISTS (
        SELECT 1 FROM parkVisits WHERE park = x.park AND visitorID = x.visitorID AND dateTimeStamp < x.dateTimeStamp
    ) returningVisitor
FROM (
    SELECT DISTINCT
        COUNT(*) visits,
        MIN(p.dateTimeStamp) dateTimeStamp,
        p.visitorID,
        p.park
    FROM parkVisits p
    WHERE
        p.dateTimeStamp BETWEEN '2019-01-01 00:00:01' AND '2019-01-04 23:59:59' 
        AND p.park ='Central'
    GROUP BY p.visitorID, p.park
) x
ORDER BY 1 desc, 2   

参见 this db fiddle .

关于mysql - 将 bool 值设置为 mysql 记录指示在所选时间戳范围之前是否存在其他记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54188551/

相关文章:

python - 仅选择在特定时间发生的行

mysql - 如何将数据导入星型数据仓库。

php - 在 php 中将 MySQL 查询写入 CSV

php - 在 mySQL 中选择一个由两个单词组成的字段名,从 PHP 中调用

SQL sum 不起作用

mysql - 有关 Select 语句的 SQL 问题

mysql - WampServer mySQL

mysql - 对州进行分组并计算每个州的邮政编码数量

powershell - 如何在 PowerShell 中将(法语)完整月份解析为日期时间对象?

javascript - 具有默认初始值的日期时间选择器(仅限基本 Html 和 Javascript)