Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 非id字段上的分组依据_Sql_Postgresql_Group By - Fatal编程技术网

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年以前过时的连接