kmo*_*ort 5 sql postgresql group-by
我正在尝试GROUP BY在PostgreSQL 9.4.1中使用,但没有获得我希望的成功。
有几个人在网上声称这应该工作,但我不能得到相同的结果。我想要的是不区分大小写的,GROUP BY但每次添加时LOWER()都会抱怨:
错误:“ people.fn”列必须出现在GROUP BY子句中或在聚合函数中使用
CREATE DATABASE TEST;
CREATE TABLE people (id INTEGER, fn TEXT, ln TEXT); /* ID, firstname, lastname */
INSERT INTO people (id, fn, ln) VALUES(1,'Mike','f');
INSERT INTO people (id, fn, ln) VALUES(2,'adam','b');
INSERT INTO people (id, fn, ln) VALUES(3,'bill','b');
INSERT INTO people (id, fn, ln) VALUES(4,'Bill','r');
INSERT INTO people (id, fn, ln) VALUES(5,'mike','d');
INSERT INTO people (id, fn, ln) VALUES(6,'mike','c');
INSERT INTO people (id, fn, ln) VALUES(7,'Mike','T');
SELECT fn FROM people GROUP BY LOWER(fn); /* will not run */
SELECT fn FROM people GROUP BY fn; /* runs, but not what I want */
Run Code Online (Sandbox Code Playgroud)
这是我得到的:
adam
mike
Mike
bill
Bill
Run Code Online (Sandbox Code Playgroud)
这就是我想要的:
Mike
adam
bill
Run Code Online (Sandbox Code Playgroud)
显然,我缺少一些东西。不,我不能只是将数据放入数据库中清理数据。我应该读什么才能理解这一点?
通常,如果要在聚合查询中选择某项,则必须按此“某项”进行分组。就您而言,您可以通过选择来获得所需的结果lower(fn):
select lower(fn)
from people
group by lower(fn)
Run Code Online (Sandbox Code Playgroud)
幸运的是,PostgreSQL允许您按别名分组,因此您不必重复lower(fn)两次:
select lower(fn) as lfn
from people
group by lfn
Run Code Online (Sandbox Code Playgroud)
正如@okaram在评论中提到的那样,如果您不需要桌上的任何其他聚集,则最好使用distinct:
select distinct lower(fn)
from people
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2158 次 |
| 最近记录: |