繁体   English   中英

使用where子句进行最大查询

[英]Max query with where clause and having

SELECT * 
FROM   `3g_t2_24hour_data` 
WHERE  `start time` = '2013-12-08' 
       AND `bsc6900ucell` = 'SYZIN9WA' 
HAVING `vs.hsdpa.meanchthroughput.totalbytes (byte)` = max( 
       `vs.hsdpa.meanchthroughput.totalbytes (byte)`) 

以上查询没有给出结果。 但2013-12-08对象SYZIN9WA有24个值。 此查询应该给出VS.HSDPA.MeanChThroughput.TotalBytes (byte)最大的所有字段的结果。

您应该使用具有cluase的Group BY:

SELECT * 
FROM   `3g_t2_24hour_data` 
WHERE  `start time` = '2013-12-08' 
   AND `bsc6900ucell` = 'SYZIN9WA' 
GROUP BY `start time`
HAVING `vs.hsdpa.meanchthroughput.totalbytes (byte)` = max( 
   `vs.hsdpa.meanchthroughput.totalbytes (byte)`)

我希望它有效。

http://www.w3schools.com/sql/sql_having.asp

这是如此复杂的表名和列名....

“以上查询没有结果。

我不这么认为。 没有聚合函数的列无法在HAVING子句中指定。

“2013-12-08中对象SYZIN9WA有24个值。此查询应该给出VS.HSDPA.MeanChThroughput.TotalBytes(byte)最大的所有字段的结果。”

如果你想要24条记录中的最大值,那很简单。

SELECT * 
FROM   `3g_t2_24hour_data` 
WHERE  `start time` = '2013-12-08' 
       AND `bsc6900ucell` = 'SYZIN9WA' 
ORDER BY `vs.hsdpa.meanchthroughput.totalbytes (byte)` DESC
LIMIT 1

但是如果你试图找到哪一行具有整个数据集的最大值,则需要一点点复杂的JOIN,如下所示。

SELECT t1.*
FROM   `3g_t2_24hour_data` t1 INNER JOIN
(
    SELECT MAX(`vs.hsdpa.meanchthroughput.totalbytes (byte)`) AS mx
    FROM `3g_t2_24hour_data`
) t2 ON t1.`vs.hsdpa.meanchthroughput.totalbytes (byte)` = t2.mx
WHERE  t1.`start time` = '2013-12-08' 
       AND t1.`bsc6900ucell` = 'SYZIN9WA' 

UPDATE

“你的第一个查询对于一个对象是可以的(比如bsc6900ucell ='SYZIN9WA')。如果我删除了这个条件,那我怎样才能得到字段下所有对象的相似结果(bsc6900ucell)。”

不确定我理解你的评论。 你能试试吗?

SELECT t1.*
FROM   `3g_t2_24hour_data` t1 INNER JOIN
(
    SELECT `bsc6900ucell`,
        MAX(`vs.hsdpa.meanchthroughput.totalbytes (byte)`) AS mx
    FROM `3g_t2_24hour_data`
    GROUP BY `bsc6900ucell`
) t2 ON t1.`vs.hsdpa.meanchthroughput.totalbytes (byte)` = t2.mx
  AND t1.`bsc6900ucell` = t2.`bsc6900ucell`
WHERE  t1.`start time` = '2013-12-08' ;

考虑这个问题的一个好方法是将条件移动到where子句。 您希望获得与最大值匹配的值(对于给定条件):

SELECT * 
FROM   `3g_t2_24hour_data` 
WHERE  `start time` = '2013-12-08' AND `bsc6900ucell` = 'SYZIN9WA' and
       `vs.hsdpa.meanchthroughput.totalbytes (byte)` =
           (select max( `vs.hsdpa.meanchthroughput.totalbytes (byte))
            from 3g_t2_24hour_data
            where `start time` = '2013-12-08' AND `bsc6900ucell` = 'SYZIN9WA'
           );

请注意,您需要重复子查询中的where条件以获得所需内容。

至于表现。 =符号后,MySQL可以很好地优化子查询。 最近的MySQL版本有做得很好in为好,虽然这是一个最近的优化。 老版本的实现in后面的子查询的效率非常低。

如果性能是一个问题,只需一个索引: 3g_t2_24hour_data(bsc6900ucell, "start time")

最后,你对having子句的原始使用在概念上确实有些意义(换句话说,这是一个常见的错误)。 但是,这不是SQL的定义方式。 在几乎所有SQL引擎中,此查询都会生成错误,因为具有长名称的列不在group by子句中。 MySQL允许这样做,但它从单行填充任意值进行比较 - 这不是你想要的。

编辑(回应评论):

使子查询成为相关子查询:

SELECT * 
FROM   `3g_t2_24hour_data` t1
WHERE  `start time` = '2013-12-08' and
       `vs.hsdpa.meanchthroughput.totalbytes (byte)` =
           (select max( `vs.hsdpa.meanchthroughput.totalbytes (byte))
            from 3g_t2_24hour_data t2
            where `start time` = '2013-12-08' AND t1.`bsc6900ucell` = t2.`bsc6900ucell`
           );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM