Sql 非id字段上的分组依据
我有以下表格设置:Sql 非id字段上的分组依据,sql,postgresql,group-by,Sql,Postgresql,Group By,我有以下表格设置: CREATE TABLE public.tags ( tag_id int4 NOT NULL, creation_timestamp timestamp NULL, "name" varchar(255) NULL, CONSTRAINT tags_pkey PRIMARY KEY (tag_id) ); -- public.tag_targets definition -- Drop table -- DROP TABLE public.tag
CREATE TABLE public.tags (
tag_id int4 NOT NULL,
creation_timestamp timestamp NULL,
"name" varchar(255) NULL,
CONSTRAINT tags_pkey PRIMARY KEY (tag_id)
);
-- public.tag_targets definition
-- Drop table
-- DROP TABLE public.tag_targets;
CREATE TABLE public.tag_targets (
id int4 NOT NULL,
creation_timestamp timestamp NULL,
target_id int8 NULL,
target_name varchar(255) NULL,
last_update_timestamp timestamp NULL,
tag_id int4 NULL,
CONSTRAINT tag_targets_pkey PRIMARY KEY (id),
CONSTRAINT fkcesi55mqvysjv63c1xf2j15oh FOREIGN KEY (tag_id) REFERENCES tags(tag_id)
);
我正在尝试运行以下查询:
SELECT *
FROM tag_targets tt, tags t
WHERE tt.tag_id = t.tag_id
AND (t."name" IN ('Keeper', 'Pk'))
GROUP by tt.target_id
但是,它希望通过以下方式获得组中标记和标记目标的PK:
ERROR: column "tt.id" must appear in the GROUP BY clause or be used in an aggregate function
在target_id列上是否还有组?另外,在我选择通用映射表和独立标记表时,请随时提供有关表设计的任何反馈。问题是,您正在请求SELECT*,但在分组中,您只指定了tt.target_id。一般来说。过于简单化:您的数据库不知道如何处理在select中请求的所有值,这些值在GROUP BY或任何agregate中都没有使用 试着运行下面的查询,看看您是否得到了什么
SELECT tt.target_id, count(*)
FROM tag_targets tt, tags t
WHERE tt.tag_id = t.tag_id
AND (t."name" IN ('Keeper', 'Pk'))
GROUP by tt.target_id
不相关,但表1、表2的语法与where子句中的join是非ANSI语法。这没有错,但出于一系列原因,我更倾向于使用显式联接的ANSI语法,我将不详细介绍:
SELECT *
FROM
tag_targets tt
join tags t on
tt.tag_id = t.tag_id
where
t."name" IN ('Keeper', 'Pk')
从表面上看,当你说“组”时,我想知道你是指排序。。。我假设您是SQL新手,所以如果这是一个过于简单的说法,请原谅,但这可能是您想要的-一个order by而不是group by
SELECT *
FROM
tag_targets tt
join tags t on
tt.tag_id = t.tag_id
where
t."name" IN ('Keeper', 'Pk')
order by
tt.target_id
另一方面,如果您只想为每个target_id创建一条记录,这实际上是一个按target_id分组的记录,那么这可能就是您想要的。。。每个target_id一条记录,但您必须确定如何对所选顺序进行优先级排序。在本例中,我建议根据最近更新的日期选择一个:
SELECT distinct on (tt.target_id)
*
FROM
tag_targets tt
join tags t on
tt.tag_id = t.tag_id
where
t."name" IN ('Keeper', 'Pk')
order by
tt.target_id, tt.last_update_timestamp desc
对这两个建议都没有信心,因此如果他们没有抓住重点,请发布一些样本数据和预期结果。为什么要分组?向我们展示您想要的输出挑剔:WHERE子句中的隐式连接是ANSI连接-只是89年以前过时的连接