1

我正在尝试执行这样的查询:

SELECT MAX(counter), MIN(counter) ,
       my_date IN (SELECT my_date FROM my_table WHERE counter = MAX(counter) )  AS max_Date ,
       my_date IN (SELECT my_date FROM my_table WHERE counter = MIN(counter) ) AS min_Date 
FROM my_table;

它给了我“无效使用组功能”错误。我想要做的是找到最大计数器的日期,然后找到最小计数器的日期。任何帮助!真的很感激..谢谢。

4

3 回答 3

2

您正在尝试逐行使用聚合函数 (max()/min()) 的结果,但在数据库扫描整个表之前,这些结果不可用。

例如,这是一个先有鸡还是先有蛋的问题。你需要数鸡,但生产鸡的鸡蛋甚至还没有产下。

这就是为什么有HAVING子句,它允许您使用聚合函数的结果进行过滤。

试试这个子查询:

SELECT my_date FROM my_table HAVING counter = MIN(counter) 
                             ^^^^^^
于 2013-06-19T15:35:28.397 回答
1

group_concat()您可以使用and的技巧获得最大和最小计数器值出现的日期substring_index()

SELECT MAX(counter), MIN(counter) ,
       substring_index(group_concat(my_date order by counter desc), ',', 1) as max_date,
       substring_index(group_concat(my_date order by counter), ',', 1) as min_date
FROM my_table;

注意:您可能希望首先根据自己的喜好格式化日期。

您也可以通过加入来执行此操作。

您的查询的问题是:

where counter = min(counter)

您不能在where子句中包含聚合函数,因为两者都引用子查询中的表。您可以使用别名来做到这一点,但为什么要麻烦呢?还有其他方法可以编写查询。

于 2013-06-19T15:38:49.677 回答
0

您需要一个子选择来获取最大和最小计数器,然后多次加入表以从这些行中获取其他值。

SELECT MaxCounter, MinCounter, a.my_date, b.my_date
FROM (SELECT MAX(counter) AS MaxCounter, MIN(counter) AS MinCounter 
FROM my_table) Sub1
INNER JOIN my_table a ON Sub1.MaxCounter
INNER JOIN my_table b ON Sub1.MinCounter

请注意,这确实假设计数器是唯一的!

于 2013-06-19T15:41:30.473 回答