3

我有一个生产读数表,需要获取一个结果集,其中包含每个小时的 min(timestamp) 行。列布局很简单:ID,TIMESTAMP,SOURCE_ID,SOURCE_VALUE

数据样本如下所示:

123,'2013-03-01 06:05:24',PMPROD,12345678.99
124,'2013-03-01 06:15:17',PMPROD,88888888.99
125,'2013-03-01 06:25:24' ,PMPROD,33333333.33
126,'2013-03-01 06:38:14',PMPROD,44444444.44
127,'2013-03-01 07:12:04',PMPROD,55555555.55
128,'2013-03-01 10: 38:14',PMPROD,44444444.44
129,'2013-03-01 10:56:14',PMPROD,22222222.22
130,'2013-03-01 15:28:02',PMPROD,66666666.66

记录全天添加到此表中,并且 source_value 已计算,因此不需要总和。

我不知道如何为current_date的每个小时获取 min(timestamp) 的一行。

select *
from source_readings
use index(ID_And_Time)
where source_id = 'PMPROD'
and   date(timestamp)=CURRENT_DATE
and   timestamp =
        ( select min(timestamp) 
            from source_readings use index(ID_And_Time)
            where source_id = 'PMPROD'
        )

当然,上面的代码给了我一个记录。我需要一条记录 current_date 的 min(hour(timestamp))。

我的结果集应该包含 ID 的行:123,127,128,130。我已经玩了几个小时了。谁能成为我的英雄?:)

4

3 回答 3

2

试试下面:

SELECT * FROM source_readings 
JOIN 
(
   SELECT ID, DATE_FORMAT(timestamp, '%Y-%m-%d %H') as current_hour,MIN(timestamp) 
   FROM source_readings 
   WHERE source_id = 'PMPROD'
   GROUP BY current_hour
) As reading_min
ON source_readings.ID = reading_min.ID
于 2013-03-01T17:44:53.557 回答
1
SELECT  a.*
FROM    Table1 a
        INNER JOIN
        (
            SELECT  DATE(TIMESTAMP) date, 
                    HOUR(TIMESTAMP) hour,
                    MIN(TIMESTAMP) min_date
            FROM    Table1
            GROUP   BY DATE(TIMESTAMP), HOUR(TIMESTAMP)
        ) b ON DATE(a.TIMESTAMP) = b.date AND
                HOUR(a.TIMESTAMP) = b.hour AND
                a.timestamp = b.min_date
于 2013-03-01T18:02:42.413 回答
0

带窗口功能:

WITH ranked (
  SELECT *, ROW_NUMBER() OVER(PARTITION BY HOUR(timestamp) ORDER BY timestamp) rn
  FROM source_readings -- original table
  WHERE date(timestamp)=CURRENT_DATE AND source_id = 'PMPROD' -- your custom filter
)
SELECT * -- this will contain `rn` column. you can select only necessary columns
FROM ranked
WHERE rn=1

我没有测试过,但基本的想法是:

1)ROW_NUMBER() OVER(PARTITION BY HOUR(timestamp) ORDER BY timestamp)

这将为每一行提供一个数字,从每小时 1 开始,按时间戳递增。结果可能如下所示:

|rest of columns                            |rn
123,'2013-03-01 06:05:24',PMPROD,12345678.99,1
124,'2013-03-01 06:15:17',PMPROD,88888888.99,2
125,'2013-03-01 06:25:24',PMPROD,33333333.33,3
126,'2013-03-01 06:38:14',PMPROD,44444444.44,4
127,'2013-03-01 07:12:04',PMPROD,55555555.55,1
128,'2013-03-01 10:38:14',PMPROD,44444444.44,1
129,'2013-03-01 10:56:14',PMPROD,22222222.22,2
130,'2013-03-01 15:28:02',PMPROD,66666666.66,1

2)然后在主查询中,我们只选择具有 的行rn=1,换句话说,在每个小时分区中具有最低时间戳的行(每小时按时间戳排序后的第一行)。

于 2019-09-23T12:13:22.730 回答