通过字段的不同值查找峰值

时间:2010-11-04 19:07:33

标签: sql

我不确定如何谷歌这个,所以让我试着解释一下。列车编号是时间表中的一个插槽,因此每天重复。对于每列火车,从开始到结束都有一组事件,这些事件包括当前重量的值。 我想知道的是每列火车的高峰期。如果我只是想要达到峰值,它只会是选择*,最大(重量)...... ,但我想通过列车编号来完成,这样我就可以得到日期/时间和站名。 我想要的是:

SELECT train, weight, date, station FROM event_table  WHERE date >= '2010/10/03' 
  AND date <= '2010/11/03' ORDER BY weight DESC LIMIT 1 GROUP BY train

但显然GROUP BY不能超过极限。我的选择是忽略限制并在PHP中过滤它,但它浪费了周期和带宽,这可能是未来的问题。

由于

5 个答案:

答案 0 :(得分:1)

如果您想要为每列火车提供最高重量 -

SELECT train, Max(weight) FROM event_table  WHERE date >= '2010/10/03' 
  AND date <= '2010/11/03' GROUP BY train

答案 1 :(得分:1)

这样的事情应该这样做:

select t.train, t2.wt, t.date, t.station
from event_table t, ( SELECT train, max(weight) wt
FROM event_table  
WHERE date >= '2010/10/03'  
  AND date <= '2010/11/03' 
GROUP BY train 
) t2
where t.train = t2.train
and t.weight = t2.weight

请注意,这允许在多个站点使用相同的最大重量。

答案 2 :(得分:1)

作为Randy答案的替代方案,您可以使用Join语法。

SELECT * 
FROM 
event_table   et
INNER JOIN (
    SELECT 
        train, 
        Max(weight) weight
    FROM 
       event_table  
    WHERE date >= '2010/10/03' 
      AND date <= '2010/11/03' 
    GROUP BY train) max 
ON et.train = max.train  and et.weight = max.weight

答案 3 :(得分:0)

我不确定这是用于MySQL还是Postgres,但我认为这个查询可能会有所帮助:

SELECT train, 
max(weight) OVER (PARTITION BY train) 
FROM event_table  ;

*它适用于版本8.4的postgres,不确定MySQL

答案 4 :(得分:0)

我似乎改进了我的Google Foo。 I found this question并提出了答案。供参考:

SELECT r2.train, r2.wight, r2.date, r2.station
FROM   (
       SELECT (
              SELECT  id
              FROM    event_table ri
              WHERE   ri.train = r1.train and date >= '2010-10-01' AND date <= '2010-12-01' 
              ORDER BY
                      ri.weight DESC
              LIMIT 1
              ) rid
       FROM   (
              SELECT DISTINCT train
              FROM event_table 
              where date >= '2010-10-01' AND date <= '2010-12-01'
              ) r1
) ro, event_table r2
WHERE  r2._id = ro.rid