如何在 Hypersql 数据库(HSQLDB)中选择多列但仅按一列分组?

Posted

技术标签:

【中文标题】如何在 Hypersql 数据库(HSQLDB)中选择多列但仅按一列分组?【英文标题】:How to select multiple columns but group by only one column in Hypersql database(HSQLDB)? 【发布时间】:2016-02-05 15:21:24 【问题描述】:

我用的是HSQLDB-2.3.3版本, 这里我展示了一个简单的 mysql 查询。

例子:

SELECT name,age,emailid,country FROM players GROUP BY country;

但如果我在HyperSQL 中执行相同的查询,则会显示错误, "Expression not in aggregate or group by columns PUBLIC.PLAYERS.NAME"

如果我将组应用于我使用select 语句选择的每一列,它会显示所有列的聚合结果。

我的问题是,如何在HyperSQL 中用一列聚合 (GROUP BY) 显示多列??

Players:

pidnameemailidcountryregionage

1SamualSamual@gmail.comINDIADELHI25

2VinoVino@gmail.comINDIADELHI20

3JohnJohn@gmail.comINDIADELHI20

4AndyAndy@gmail.comINDIADELHI22

5BrianBrian@hotmail.comAmericaDELHI21

6DewDew@hotmail.comAmericaDELHI24

7KrisKris@hotmail.comAmericaDELHI25

8WilliamWilliam@hotmail.comINDIADELHI26

9GeorgeGeorge@hotmail.comINDIADELHI23

10PeterPeter@gmail.comINDIADELHI19

11TomTom@gmail.comAmericaDELHI20

12AndreAndre@hotmail.comINDIADELHI20

预计Result:

nameageemailidcountry

Brian21Brian@hotmail.comAmerica

Samual25Samual@gmail.comINDIA

【问题讨论】:

请添加一些示例数据和预期结果。例如,如果两个不同的人在同一个国家/地区,您希望在该国家/地区的分组行中返回什么数据。 【参考方案1】:

GORUP BY 在 MySQL 中的实现不同于其他遵循 SQL 标准的数据库。在这种情况下,查询不应该工作。

您期望的结果包含每个国家/地区的pid 最低的人。您可以编写一个明确要求的查询:

SELECT name, age, emailid, country FROM players 
    WHERE pid IN (SELECT MIN(pid) FROM players GROUP BY country)

查询首先找到每个国家/地区的最低pid。然后它选择包含这些pid 值的两行。

【讨论】:

以上是关于如何在 Hypersql 数据库(HSQLDB)中选择多列但仅按一列分组?的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB (HyperSQL) - 如何以毫秒精度将 UNIX 时间戳作为数字获取

HyperSQL / HSQLDB 数据库能抵抗密码攻击吗?

HyperSQL (HSQLDB) 显式共享(读取)锁语法

无法以新用户身份连接到 HyperSQL / HSQLDB 数据库

HyperSQL 链接参数中文件的路径

如何从 C# 连接到 HyperSQL DB