我正在为每天上午10点到早上6点开放的俱乐部编写客户忠诚度软件。数据存储在MYSQL中,我想计算客户当月的总访问量。
我正在使用计数(不同(日期)),但是如果玩家在下午5点来到并且一直持续到凌晨3点,在晚上10点和凌晨2点有2笔交易。它将被计为2次访问,而不是1次。
我有一个包含下列列的交易表:
ps:括号()中的任何内容都不是真实数据。我每天约有2000笔交易。我也可以更改表结构
Transaction_ID | Date(not Date/Time) | Customer_ID | Item | price | timestamp 1 | 11-06-2015 (6pm) | Jane | drink| 2.00 | 156165166 2 | 09-06-2015 (2pm) | Jane | drink| 2.00 | 1433858493 3 | 10-06-2015 (3am) | Jane | drink| 2.00 | 1433906073 4 | 06-06-2015 (6pm) | Jane | drink| 2.00 | 156165166
当前代码返回{4,Jane}。我正在寻找的答案是{3,Jane}。交易{2,3}应被视为一次访问
SELECT count(distinct(Date)) as visit, Customer_ID
FROM transaction
GROUP BY Customer_ID
WHERE timestamp BETWEEN $timestamp1 AND $timestamp2
$timestamp1 = strtotime("first day of february +10am"); $timestamp2 = strtotime("first day of march +6am");
您如何建议准确计算下面的总访问次数?我能够将表格结构从日期更改为日期/时间。
最简单的答案,对我的代码进行的修改最少。
SELECT count(DISTINCT(DATE(DATE_SUB(from_unixtime(timestamp),INTERVAL 6 HOUR))) as visit, Customer_ID FROM transaction GROUP BY Customer_ID WHERE timestamp BETWEEN $timestamp1 AND $timestamp2
答案 0 :(得分:1)
最简单的方法是在SQL语句中将日期时间(date
,timestamp
?)字段移回6小时,然后在凌晨4点到12点之间的一天内获得间隔:< / p>
DISTINCT(DATE(DATE_SUB(dt,INTERVAL 6 HOUR)))
答案 1 :(得分:0)
以下是您需要的代码:
SELECT
Customer_ID 'Customer ID'
, COUNT(DISTINCT visit) as 'Visits per month'
, MONTH(visit) 'Month'
, YEAR(visit) 'Year'
FROM
(SELECT
*
, CASE
WHEN (t_timestamp > Date_StartDate AND t_timestamp < Date_EndDate)
THEN d_date
WHEN (t_timestamp < Date_StartDate)
THEN date_add(d_date, INTERVAL -1 DAY)
END 'visit'
FROM
(SELECT *
, DATE_ADD(CAST(d_date AS DATETIME), INTERVAL 10 HOUR) Date_StartDate
, DATE_ADD(DATE_ADD(cast(d_date AS DATETIME), INTERVAL 6 HOUR), INTERVAL 1 DAY) Date_EndDate
FROM transactions) Results
) Results
GROUP BY customer_id, month(visit), year(visit)
另外,这里有SQLFiddle代码的结果。
我没有使用Customer_ID的确切格式(我使用的是INTEGER而不是VARCHAR),并且没有使用您在示例中使用的确切日期,但显然它应该适用于任何事情。
考虑将我的查询中使用的列的名称调整为适当的列名,您应该没问题。