将布尔值设置为mysql记录,以指示在所选时间戳范围之前是否存在其他记录
基本表格类似于: mysqlTable: 访客ID、公园、日期时间戳 伯明翰8369号,2018年12月27日03:26:38 伯明翰8369号,2018年12月28日上午11:27:32 中环8888号,2019年2月1日10:01 2019年4月1日9:50,中环888 2018年12月21日上午9:47:27,中环8825 2018年12月26日上午10:11:40,中环8821 2019年3月2日上午10:00:59,中环8821 中环8821号,2019年2月1日10:04将布尔值设置为mysql记录,以指示在所选时间戳范围之前是否存在其他记录,mysql,sql,datetime,count,window-functions,Mysql,Sql,Datetime,Count,Window Functions,基本表格类似于: mysqlTable: 访客ID、公园、日期时间戳 伯明翰8369号,2018年12月27日03:26:38 伯明翰8369号,2018年12月28日上午11:27:32 中环8888号,2019年2月1日10:01 2019年4月1日9:50,中环888 2018年12月21日上午9:47:27,中环8825 2018年12月26日上午10:11:40,中环8821 2019年3月2日上午10:00:59,中环8821 中环8821号,2019年2月1日10:04 8828
88281,Central,2019年4月1日9:53假设您正在运行MySQL 8.0,您可以使用带有窗口功能的内部查询来获取分析期间第一次访问的时间戳。然后在外部查询中,可以使用带有子查询的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
注:我想返回的访客是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
请参阅。因为您是按visitorID分组的,这意味着dateTimeStamp基本上是该用户所有行中的任意值。MySQL可能会碰巧返回第一个/最早的see,但这不能保证。您需要更好地描述在这段时间内有多个访问时如何选择dateTimestamp。这个时期的早期访问怎么样?还是T可能是最后一个?第一个更好。编辑:在第二节课上,没关系,yy:mm:dd才是最重要的。很好!,但我用的是5.6。40@Anatsu:我用MySQL 5的查询更新了我的答案。x回答了我的问题,作为奖励,我学到了8.0和5.x之间的区别+1和V当之无愧,先生!欢迎@Anatsu!
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