当我读到这篇文章时: SQL: Group by minimum value in one field while selecting distinct rows
以下解决方案对我没有意义,我想知道它是如何工作的:
SELECT id, min(record_date), other_cols
FROM mytable
GROUP BY id
这对我的数据库不起作用,对我来说它似乎不合逻辑(尽管它在SQL小提琴示例中有效)。我的DBMS抱怨
列必须是组列:other_cols
我正在使用MaxDB - 这是DBMS特有的问题吗?
答案 0 :(得分:3)
它适用于某些RDBMS,如 MySQL 。 MySQL docs说:
MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。
但是对于 SQL Server ,您需要在GROUP BY
子句中包含所有字段。否则,它将报告错误,如:
专栏' ColName'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
请参阅MSDN。
答案 1 :(得分:2)
这取决于您使用的是哪个RDBMS,我知道SQL Server
将不允许这样做,因为您需要对{{1}以外的每个字段执行汇总操作(MIN,MAX,AVERAGE等) 1}}子句或将字段添加到Group By
子句。
当您使用Group By
运行小提琴时,您可以从示例中看到它有效并且似乎为每个集合返回MySql
的第一个值。
根据您的问题,您使用的是不支持此语法的RDBMS(如SQL Server)。
答案 2 :(得分:0)
这是SQL标准。相反,您可以使用:
SELECT mytable.id, mytable_id_with_min_date.min_record_date, other_cols
FROM mytable JOIN
(
SELECT id, min(record_date) min_record_date
FROM mytable
GROUP BY id
) mytable_id_with_min_date ON (mytable_id_with_min_date.id = mytable.id AND mytable.record_date = mytable_id_with_min_date.min_record_date)
也许你的代码看起来合乎逻辑,但是你将哪些行放入other_cols?