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)
最大的所有字段的结果。
答案 0 :(得分:2)
您应该将Group BY与having子句一起使用:
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)`)
我希望它有效。
答案 1 :(得分:0)
这是如此复杂的表名和列名......
“上述查询没有结果。”
我不这么认为。没有聚合函数的列不能在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'
“你的第一个查询对于一个对象是好的(比如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' ;
答案 2 :(得分:0)
考虑这个问题的好方法是将条件移到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`
);