首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何选择日期间隔

如何选择日期间隔
EN

Stack Overflow用户
提问于 2010-03-22 14:17:00
回答 3查看 1.3K关注 0票数 3

这是我的桌子:

代码语言:javascript
复制
+------+--------+-------------------+
| user | item   | date_time         |
|   10 |     01 | 10-10-10 20:10:05 |
|   10 |     02 | 10-10-10 20:10:10 |
|   10 |     03 | 10-10-10 20:10:10 |
|   20 |     02 | 10-10-10 20:15:10 |
|   20 |     02 | 10-10-10 20:20:10 |
|   30 |     10 | 10-10-10 20:01:10 |
|   30 |     20 | 10-10-10 20:01:20 |
|   30 |     30 | 10-10-10 20:05:20 |
+------+--------+-------------------+

我想要执行一个查询,返回一个在1分钟间隔内获取多个项的用户,如下所示:

代码语言:javascript
复制
+------+--------+-------------------+
| user | item   | date_time         |
|   10 |     01 | 10-10-10 20:10:05 |
|   10 |     02 | 10-10-10 20:10:10 |
|   10 |     03 | 10-10-10 20:10:10 |
|   30 |     10 | 10-10-10 20:01:10 |
|   30 |     20 | 10-10-10 20:01:20 |
+------+--------+-------------------+

我该怎么做?

编辑

如果我只想在这个输出上显示2次或2次以上的用户?

示例:

代码语言:javascript
复制
+------+--------+-------------------+
| user | item   | date_time         |
|   10 |     01 | 10-10-10 20:10:05 |
|   10 |     02 | 10-10-10 20:10:10 |
|   10 |     03 | 10-10-10 20:10:10 |
+------+--------+-------------------+
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-22 14:40:47

是的,您需要按照@Will的建议添加主键(id)。

要获得每一项一次(而且只有一次),无论在1分钟窗口内有多少匹配项,请尝试一个子查询而不是完全连接:

代码语言:javascript
复制
Select user,item,date_time from my_table t1
  where id in (select t2.id from my_table t2,my_table t3
      where t2.id <> t3.id and t2.user = t3.user 
           and abs(t2.date_time - t3.date_time) < 60)

-编辑--关于你被编辑的问题,这完全取决于你的意思。您的意思是“用户在60秒内购买了3个或3个以上的商品”还是“在输出中出现超过2次的用户”。后者很容易完成:假设上述查询的结果保存在临时表(或视图)“temp1”中:

代码语言:javascript
复制
select * from my_table where user in 
    (select user from temp1 group by user having count(*) > 2);
票数 1
EN

Stack Overflow用户

发布于 2010-03-22 14:22:39

您必须针对自己加入表(让我们调用表别名T1和T2)。然后编写WHERE子句,只过滤T1.user等于T2.user且T1.date_time和T2.date_time之间差的绝对值小于1分钟的行。

但问题是,每一行都将被选中,因为您的表中没有主键,因此无法检测某一行何时与其连接。创建一个主键(自动编号序列工作得很好),并在WHERE子句中添加一个条件,上面写着T1.id <> T2.id

因此,在(未经测试的)代码表单中:

代码语言:javascript
复制
SELECT *
FROM stuff T1, stuff T2
WHERE T1.user = T2.user
  AND ABS(UNIX_TIMESTAMP(T1.date_time) - UNIX_TIMESTAMP(T2.date_time)) < 60
  AND T1.id <> T2.id;
票数 1
EN

Stack Overflow用户

发布于 2010-03-22 14:37:39

让我们试试这个:

代码语言:javascript
复制
SELECT * FROM myTable  
JOIN (SELECT MAX(date_time) AS maxi, MIN(date_time) AS mini, user AS uid FROM myTable GROUP BY uid) AS otherTable  
ON date_time<=maxi AND date_time>=mini AND user = uid AND UNIX_TIMESTAMP(maxi) - UNIX_TIMESTAMP(mini) < 60  
GROUP BY uid, date_time
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2492872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档