【问题标题】:Fetch Maximum data within date range without duplicate MYSQL获取日期范围内的最大数据而不重复 MYSQL
【发布时间】:2013-03-28 01:40:12
【问题描述】:

我在查询时遇到了麻烦。

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-Jun-12 08:00] 和 [13-Jun-12 10:00]
2 之间的特定日期范围获取数据。一旦它获取范围内的日期,它将获取最新的日期而不重复。

输出应该是这样的:
1.日期范围

[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 |

非常感谢大家!

【问题讨论】:

    标签: mysql sql group-by between


    【解决方案1】:
    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

    【讨论】:

    • 这会返回 567 的错误 pk_id -- 它应该返回 4。
    • 小心这种方法..这是一个捷径,只有在所有其他数据相同时才有效..正如@sgeddes指出的那样,这里失败了,因为它选择了错误的pk_id
    【解决方案2】:

    您的查询非常接近。需要选择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

    返回:

    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 字段。我还建议使用&gt;=&lt;= 而不是BETWEEN,因为BETWEEN 可能无法获得您想要的结果。

    【讨论】:

    • WHERE Some_Timestamp >= '13-Jun-12 08:00' AND some_timestamp
    • @TigaPuluhSaat——你明白了。祝你好运!
    【解决方案3】:

    我想你想要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,与最大时间戳无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-13
      • 2013-04-02
      • 1970-01-01
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 1970-01-01
      相关资源
      最近更新 更多