我的表是这样的:
名称:用户交易数据
日期格式DD / MM / YYYY
数据仅4个月(9月,10月,11月,12月)
Id User Date
25 127 23/10/2014
26 128 25/11/2014
25 127 22/11/2014
47 17 22/1/2014
25 127 12/9/2014
25 127 22/12/2014
如果我想在30天内找到至少出现一次的用户。 答案应该是127.因为用户127在所有4个月内至少出现一次 用户128在11月仅完成了一次交易。未完成每月至少一次交易,因此未选择
如何为此编写查询?
答案 0 :(得分:0)
SELECT *
FROM TABLE_NAME
WHERE Date_Column >= DATEADD(MONTH, -1, GETDATE())
或
SELECT *
FROM TABLE_NAME
WHERE Date_Column >= DATEADD(DAY, -30, GETDATE())
答案 1 :(得分:0)
SELECT User, COUNT(*) AS number_of_presence FROM (
SELECT DATE_FORMAT(`Date`,'%Y-%m') AS date_month, User
FROM `table`
GROUP BY date_month, User
) TMP
GROUP BY User
HAVING number_of_presence = 4
group by
用于多次避免同一用户。
答案 2 :(得分:0)
我想你已经连续30天了,对吗? 不幸的是,您可能必须将表连接到自身,因为它会查找行的对。然后查询将是:
select
a1.User,
a1.Date as fromDate,
a2.Date as toDate,
datediff(a1.Date, a2.Date) as span
from appearances a1, appearances a2
where
a1.User=a2.User and
a2.Date>a1.Date and
datediff(a2.Date, a1.Date) <= 30;
创建记录结构:
CREATE TABLE appearances
(`Id` int, `User` int, `Date` date)
;
INSERT INTO appearances
(`Id`, `User`, `Date`)
VALUES
(25, 127, '2014-10-23'),
(26, 128, '2014-11-25'),
(25, 127, '2014-11-22'),
(47, 17, '2014-01-22'),
(25, 127, '2014-09-12'),
(25, 127, '2014-12-22')
;
答案 3 :(得分:0)
如果您知道要检查用户是否存在的日期,则可以选择日期在您的范围内的所有行WHERE
。我会使用BETWEEN
关键字。例如,如果您想要在3月份活跃的用户,您可以执行以下操作:
SELECT *
FROM myTable
WHERE dateColumn BETWEEN '2014-03-01' AND '2014-03-31';
对于这个具体示例,您似乎希望用户在过去4个月中至少进行过一次购买。你可以做的是通过使用DATE_SUB()
函数设置开始日期来获取过去4个月中每一行的行:
SELECT *
FROM myTable
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH);
完成后,您可以按用户和月份添加GROUP BY
语句,以便每个用户和每月获得一行:
SELECT *
FROM myTable
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH)
GROUP BY user, MONTH(date);
一旦你拥有了它,你就可以从中获取用户HAVING
四行,因为这意味着他们已经在四个月中的每一个月都进行了购买:
SELECT user
FROM(
SELECT *
FROM myTable
WHERE date >= DATE_SUB(CURDATE(), INTERVAL 4 MONTH)
GROUP BY user, MONTH(date)) t
GROUP BY user
HAVING COUNT(*) = 4;
以下是SQL Fiddle示例。
另外,这里有一些很好的日期和时间functions供您牢记。