【问题标题】:mysql select the latest 2 rows per category (minimum age difference from these 2 rows: 6hours)mysql 每个类别选择最新的 2 行(这 2 行的最小年龄差异:6 小时)
【发布时间】:2015-09-23 12:24:18
【问题描述】:

我得到了下表

+----+---------------------+------------+-------+
| id | record_time         | price_date | price |
+----+---------------------+------------+-------+
| 1  | 2015-09-23 08:05:05 | 2015-09-29 | 100   |
| 2  | 2015-09-23 04:05:05 | 2015-09-29 | 101   |
| 3  | 2015-09-22 08:05:05 | 2015-09-29 | 102   |
| 4  | 2015-09-21 08:05:05 | 2015-09-29 | 103   |
| 5  | 2015-09-23 08:05:05 | 2015-09-30 | 104   |
| 6  | 2015-09-23 08:01:05 | 2015-09-30 | 105   |
| 7  | 2015-09-22 08:05:05 | 2015-09-30 | 106   |
+----+---------------------+------------+-------+

我想获得两个最新的 price_date 行,但是这 2 行与 record_time 之间的差异至少为 6 小时。

预期结果

| 1 | 2015-09-23 08:05:05 | 2015-09-29 | 100
| 3 | 2015-09-22 08:05:05 | 2015-09-29 | 102
| 5 | 2015-09-23 08:05:05 | 2015-09-30 | 104
| 7 | 2015-09-22 08:05:05 | 2015-09-30 | 106

有人知道怎么做吗?

【问题讨论】:

    标签: mysql select grouping rows


    【解决方案1】:

    给你!

        SELECT 
        *
    FROM
        (SELECT 
            *
        FROM
            (SELECT 
            *
        FROM
            (SELECT 
            dt1.*
        FROM
            data_table dt1
        JOIN (SELECT 
            price_date
        FROM
            data_table
        GROUP BY price_date) dt2 ON (dt1.price_date = dt2.price_date)
        ORDER BY record_time DESC) dt
        GROUP BY price_date
        ORDER BY price_date) a UNION ALL 
        SELECT 
            *
        FROM
            (SELECT 
            *
        FROM
            (SELECT 
            dt2.*
        FROM
            (SELECT 
            *
        FROM
            (SELECT 
            dt1.*
        FROM
            data_table dt1
        JOIN (SELECT 
            price_date
        FROM
            data_table
        GROUP BY price_date) dt2 ON (dt1.price_date = dt2.price_date)
        ORDER BY record_time DESC) dt
        GROUP BY price_date
        ORDER BY price_date) dt1
        JOIN (SELECT 
            dt1.*
        FROM
            data_table dt1
        LEFT JOIN (SELECT 
            dt.id
        FROM
            (SELECT 
            dt1.*
        FROM
            data_table dt1
        JOIN (SELECT 
            price_date
        FROM
            data_table
        GROUP BY price_date) dt2 ON (dt1.price_date = dt2.price_date)
        ORDER BY record_time DESC) dt
        GROUP BY price_date) dt2 ON (dt1.id = dt2.id)
        WHERE
            dt2.id IS NULL
        ORDER BY price_date DESC) dt2 ON (dt1.price_date = dt2.price_date
            AND dt2.record_time < DATE_ADD(dt1.record_time, INTERVAL - 6 HOUR))
        ORDER BY dt2.record_time DESC) dt
        GROUP BY price_date) a) a
    ORDER BY price_date ASC , record_time DESC;
    

    【讨论】:

    • 感谢您的贡献。但是,它不起作用:(我只在表中得到最后 4 个 price_dates(表中有一整年),时差和最新的 2 行也不起作用:(还有其他想法吗?
    • @JOhnlw009a,您有什么要求?您在问题中提到了get the two latest price_date rows。您需要每天的结果吗?
    • 是的,每天2个版本(price_date),第一个:最新版本,第二个:比最新版本(record_time)至少早6小时或更长时间的版本。
    • 您有 31 个price_dates,只有一个条目。那么如何在一天内获得 2 个版本呢? select * from (select count(id) count, price_date from data_table group by price_date) a where a.count &lt; 2
    • 好吧,请阅读我的问题。你的答案根本行不通。 sqlfiddle:这只是表格的一小部分。上面的例子很好地解释了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2011-04-20
    • 2012-10-09
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多