将布尔值设置为 mysql 记录指示在所选时间戳范围之前是否存在其他记录
Set a Boolean as a mysql record indicates if other record exists before chosen timeStamp range
基本 table 类似于:
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
从这个 table 我正在创建一个新的,我在其中计算特定公园的访客 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
我想要一列,其中的布尔值指示访问者是否在该行的指定日期 之前的任何时间访问过。
我正在考虑将 table 上最早的 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,您可以使用带有 window 函数 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 你的示例数据中,它 returns :
| 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 的低版本,不支持 window 函数,您可以在子查询中使用 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
基本 table 类似于:
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
从这个 table 我正在创建一个新的,我在其中计算特定公园的访客 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
我想要一列,其中的布尔值指示访问者是否在该行的指定日期 之前的任何时间访问过。 我正在考虑将 table 上最早的 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,您可以使用带有 window 函数 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 你的示例数据中,它 returns :
| 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 的低版本,不支持 window 函数,您可以在子查询中使用 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