2013-03-28 50 views
2

我在查询时遇到了麻烦。在日期范围内获取最大数据而无重复MYSQL

SELECT * FROM YourTable AS T1 
INNER JOIN 
(SELECT user_id , MIN(some_timestamp) AS some_timestamp FROM YourTable 
GROUP BY user_id) AS T2 
ON T1.User_Id = T2.User_Id AND T1.some_timestamp = T2.some_timestamp 
WHERE Some_Timestamp BETWEEN '13-Jun-12 08:00' AND '13-Jun-12 10:00'

表名:YourTable


| PK_ID | USER_ID | SOME_TIMESTAMP | 
------------------------------------| 
|  1 |  123 | 13-Jun-12 14:30 | 
|  2 |  123 | 13-Jun-12 08:50 | 
|  3 |  567 | 13-Jun-12 09:23 | 
|  4 |  567 | 13-Jun-12 09:45 | 
|  5 |  567 | 13-Jun-12 09:40 | 
|  6 |  890 | 13-Jun-12 08:44 | 

什么,我想是这样的
1.从特定日期范围内获取数据[13军12 08:00] &之间[13-Jun-12 10:00]
2.一旦获取范围内的日期,它将获取最新的日期而不重复。

输出应该是这样的:
1.date范围之间

[13-Jun-12 08:00] & [13-Jun-12 10:00]

2.只取不重复的最新时间戳。

结果应该是这样的



| PK_ID | USER_ID | SOME_TIMESTAMP | 
------------------------------------| 
|  2 |  123 | 13-Jun-12 08:50 | 
|  4 |  567 | 13-Jun-12 09:45 | 
|  6 |  890 | 13-Jun-12 08:44 | 

非常感谢大家!

回答

4
SELECT 
    pk_id, 
    user_id, 
    MAX(some_timestamp) 
FROM 
    your_table 
WHERE 
    some_timestamp>= '13-Jun-12 08:00' 
AND some_timestamp<= '13-Jun-12 10:00' 
GROUP BY 
    user_id 
ORDER BY 
    pk_id ASC 

SQL Fiddle

+0

这将返回不正确的pk_id为567 - 它应该返回4. – sgeddes 2013-03-28 02:00:21

+0

要小心这种方法..这是一个快捷方式,只有当所有其他数据是相同的。..作为@sgeddes指出,这失败在这里,因为它选错了pk_id – whiteatom 2013-04-06 13:25:30

1

您所查询的是八九不离十。根据需要

PK_ID USER_ID SOME_TIMESTAMP 
2  123  June, 12 2013 08:50 
4  567  June, 12 2013 09:45 
6  890  June, 12 2013 08:44 

格式的SOME_TIMESTAMP领域:根据需要选择MAX代替MIN,并且需要将WHERE标准移动到子查询:

SELECT * 
FROM YourTable AS T1 
    INNER JOIN 
    (SELECT user_id , MAX(some_timestamp) AS some_timestamp 
    FROM YourTable 
    WHERE Some_Timestamp BETWEEN '2013-06-12 08:00' AND '2013-06-12 10:00' 
    GROUP BY user_id) AS T2 
    ON T1.User_Id = T2.User_Id AND T1.some_timestamp = T2.some_timestamp 

SQL Fiddle Demo

返回。我还建议使用>=<=而不是BETWEEN,因为您可能无法通过BETWEEN得到预期结果。

+0

亲爱的sgeddes,你能告诉我使用> =&&lt; = – 2013-03-28 02:41:39

+0

WHERE Some_Timestamp> = '13 -Jun-12 08:00'AND some_timestamp <= '13 -Jun-12 10:00' – 2013-03-28 02:49:47

+0

@TigaPuluhSaat - 你明白了。祝你好运! – sgeddes 2013-03-28 12:49:04

0

我想你想的pk_id在最大时间戳的时间。

在MySQL中做到这一点,您通常必须加入原始数据回。在你的情况,不过,似乎pk_id为增加时间戳增加。如果这是真的,那么下面的查询应返回你想要什么:

select max(pk_id) as pk_id, user_id, max(some_timestamp) 
FROM your_table 
WHERE Some_Timestamp between '13-Jun-12 08:00' AND Some_Timestamp <= '13-Jun-12 10:00' 
GROUP BY user_id 
ORDER BY pk_id ASC 

如果不包括max(pk_id),然后任意pk_id将返回,并就什么都没有做的最大时间戳。