标签: group-by

GROUP BY 和 ORDER BY 问题

我有两张这样的表:

CREATE TABLE cmap5 (
   name     varchar(2000),
   lexemes  tsquery
);
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE IF NOT EXISTS synonyms_all_gin_tsvcolumn (
   cid       int NOT NULL,  -- REFERENCES pubchem_compounds_index(cid)
   name      varchar(2000) NOT NULL,  
   synonym   varchar(2000) NOT NULL,
   tsv_syns  tsvector,
   PRIMARY KEY (cid, name, synonym)
);
Run Code Online (Sandbox Code Playgroud)

我目前的查询是:

SELECT s.cid, s.synonym, c.name, ts_rank(s.tsv_syns,c.lexemes,16) 
FROM synonyms_all_gin_tsvcolumn s, cmap5 c
WHERE c.lexemes @@ s.tsv_syns
Run Code Online (Sandbox Code Playgroud)

输出是:

cid     |  synonym                              | name (query)              | rank
5474706 | 10-Methoxyharmalan                    | 10-methoxyharmalan        | 0.0901673
1416    | (+/-)12,13-EODE                       | 12,13-EODE                | 0.211562
5356421 …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate full-text-search group-by greatest-n-per-group

7
推荐指数
1
解决办法
4万
查看次数

带有 JOIN 和 GROUP BY 查询的 SELECT 中的错误“列不存在”

我将 PostgreSQL 9.1 与 Ruby on Rails 应用程序一起使用。

我正在尝试列出属于同一项目 ID (proj_sous_projet_id = 2) 的每个“费用”(在我的历史表中:hist_version_charges)的最后一个版本。

这使我使用 max() 聚合函数并将结果应用于同一个表上的 JOIN 函数,因为如果 SELECT 子句中的列未出现在 GROUP BY 子句中,则 PostgreSQL 没有授权使用它们,但使用最大值() 显然我对包含最大值的行感兴趣!

这是我的查询:

SELECT h_v_charges.*, 
       max(last_v.version) as lv 
FROM hist_versions_charges h_v_charges 
    JOIN hist_versions_charges last_v 
      ON h_v_charges.version = lv 
    AND h_v_charges.proj_charge_id = last_v.proj_charge_id 
GROUP BY last_v.proj_sous_projet_id, 
         last_v.proj_charge_id 
HAVING last_v.proj_sous_projet_id = 2 
ORDER BY h_v_charges.proj_charge_id ASC;
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息:

ERROR:  column "lv" does not exist
LINE 1: ..._versions_charges last_v ON h_v_charges.version = lv AND h_v...
                                                             ^
********** Error ********** …
Run Code Online (Sandbox Code Playgroud)

postgresql join select group-by

7
推荐指数
1
解决办法
4万
查看次数

仅获取多个字段的整体汇总 WITH ROLLUP 和 GROUP BY

执行WITH ROLLUP多字段分组时,MySQL 会为每个组返回一个汇总行,以及总体摘要:

CREATE TABLE test (name VARCHAR(50), number TINYINT);
INSERT INTO test VALUES
    ('foo', 1), ('foo', 1), ('foo', 2), ('foo', 3), ('foo', 3),
    ('bar', 1), ('bar', 2), ('bar', 2), ('bar', 2), ('bar', 3),
    ('baz', 1), ('baz', 2), ('bar', 2);
SELECT name, number, COUNT(1) FROM test GROUP BY name, number WITH ROLLUP;

+------+--------+----------+
| name | number | count(1) |
+------+--------+----------+
| bar  |      1 |        1 |
| bar  |      2 |        3 |
| bar  | …
Run Code Online (Sandbox Code Playgroud)

mysql group-by

7
推荐指数
1
解决办法
2万
查看次数

在 SQL Server 中的 DATETIME 列上按 MONTH 对数据进行分组

我有一个表Employee,其中包含列 ID、加入日期和名称

加入日期是一DATETIME栏。

我想知道十月份有多少用户加入?

sql-server group-by datetime

7
推荐指数
1
解决办法
12万
查看次数

绕过约束“列必须出现在 GROUP BY 子句中或用于聚合函数中”

我正在使用 Postgres,它强制执行 SELECT...GROUP BY 中的所有列必须出现在 GROUP BY 子句中或在聚合函数中使用的约束。

假设我正在为人们的汽车建模,我想算出一个人的姓名、牌照号码以及他们拥有的汽车数量。这是我作为SQL Fiddle 的示例。

我会有以下架构:

CREATE TABLE person(
  id integer PRIMARY KEY,
  name text
);

CREATE TABLE license(
  person_id integer REFERENCES person(id),
  expiry_date date
);

CREATE TABLE car(
  owner_id integer REFERENCES person(id),
  registration_number TEXT
);
Run Code Online (Sandbox Code Playgroud)

这是查询:

SELECT person.name, person.id, license.expiry_date, COUNT(car) FROM person
  JOIN license ON license.person_id = person.id
  JOIN car ON car.owner_id = person.id
WHERE person.name = 'Charles Bannerman'
GROUP BY person.id;
Run Code Online (Sandbox Code Playgroud)

知道,因为我自己的业务逻辑,一个人只能有一个license,所以当我加入这个人的时候,即使是GROUP BY'd,我应该可以找到他们的license number。但是,因为它不是 GROUP …

postgresql join aggregate group-by

7
推荐指数
1
解决办法
3万
查看次数

当 group by 包含多个具有相同值的行时选择?

我正在尝试编写一个查询,当连接表 B 中的列包含表 A 中单个匹配行的多个不同值时,该查询从表 A 中返回一行。(A -> B 是 1 -> 多关系。)我构建了在上下文中演示这一点的 SQL 小提琴:http : //sqlfiddle.com/#!6/83952/1

在这个小提琴中,表格的designperf_ticket_type对于每个ticket_type具有相同的 都应该是相同的perf_id,但我试图只选择它没有的实例。因此,对于perf_id3,design我当前使用的查询返回了不止一个唯一值。

我想我的结果是两列performance的表只对perf_id3的基础上的多重价值designperf_id所加入的表。

过去我一直对 GROUP BY 的理解感到沮丧,所以我不确定我是否可以在这里做一些不同的事情来获得我想要的结果。此刻,我想我可以选择什么我都在拨弄到一个临时表,然后做另一个选择上GROUP BY perf_id HAVING COUNT(*) > 1得到我想要的东西(按其中列包含在一个以上的记录相同的数据选择行)但这似乎是一个额外的步骤。

sql-server aggregate t-sql group-by

7
推荐指数
1
解决办法
3万
查看次数

提高 GROUP BY 子句中的排序性能

我在 Postgres 9.4.1 中有两个表,eventsevent_refs具有以下模式:

events 桌子

CREATE TABLE events (
  id serial NOT NULL PRIMARY KEY,
  event_type text NOT NULL,
  event_path jsonb,
  event_data jsonb,
  created_at timestamp with time zone NOT NULL
);

-- Index on type and created time

CREATE INDEX events_event_type_created_at_idx
  ON events (event_type, created_at);
Run Code Online (Sandbox Code Playgroud)

event_refs 桌子

CREATE TABLE event_refs (
  event_id integer NOT NULL,
  reference_key text NOT NULL,
  reference_value text NOT NULL,
  CONSTRAINT event_refs_pkey PRIMARY KEY (event_id, reference_key, reference_value),
  CONSTRAINT event_refs_event_id_fkey FOREIGN KEY (event_id) …
Run Code Online (Sandbox Code Playgroud)

postgresql performance execution-plan group-by postgresql-9.4 postgresql-performance

6
推荐指数
1
解决办法
2674
查看次数

ONLY_FULL_GROUP_BY 模式和具有相同列名的表的非分组字段错误

我发现 MySQL 在ONLY_FULL_GROUP_BY启用模式时似乎有问题,并且查询包含 a HAVING,它指的是来自不同表的具有相同名称的分组列。

这是复制问题的架构:

CREATE TABLE t1 (c1 INT, c2 INT);
CREATE TABLE t2 (c1 INT, c2 INT);
Run Code Online (Sandbox Code Playgroud)

您需要添加ONLY_FULL_GROUP_BY到您的 SQL 模式:

SET SESSION SQL_MODE='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY'
Run Code Online (Sandbox Code Playgroud)

这是创建错误的查询:

SELECT t1.c1, t2.c1
FROM t1, t2
GROUP BY t1.c1, t2.c1
HAVING t1.c1 > 1 AND t2.c1 > 1;
Run Code Online (Sandbox Code Playgroud)

错误内容:

HAVING 子句中使用了非分组字段“c1”

双方t1.c1t2.c1进行分组,所以我看不出有什么不对这个查询。

此外,如果查询引用同一个表中的不同列名,则查询有效。例如:

SELECT t1.c1, t2.c2
FROM t1, t2
GROUP BY t1.c1, t2.c2
HAVING t1.c1 > 1 AND t2.c2 > 1;
Run Code Online (Sandbox Code Playgroud)

难道我做错了什么?我在任何地方都找不到有关此问题的报告。我可以在 Ubuntu 上的 …

mysql mysql-5.5 group-by mysql-5.6

6
推荐指数
1
解决办法
1551
查看次数

查询以获取每个组的队列位置

我有一个包含以下示例数据的队列表:

id  company location
1   acme    new york
2   acme    philadelphia
3   genco   st.louis
4   genco   san diego
5   genco   san francisco
6   acme    miami
Run Code Online (Sandbox Code Playgroud)

我想查询每个公司组的队列位置以显示每个公司的排队位置(假设 acme 在 500 Genco 开始之前有 1,000 行,然后在 Genco 记录过程之后 acme 有 5,000 行)。我想要的结果如下所示:

queuePositionId company
1    acme
3    genco
6    acme
Run Code Online (Sandbox Code Playgroud)

我玩过排名和分组,但事实上一个公司组可以在队列中的任何地方多次出现,这一直在扰乱我的聚合。我也尝试过,dense_rank但无法弄清楚顺序。有任何想法吗?

sql-server t-sql sql-server-2008-r2 group-by gaps-and-islands

6
推荐指数
1
解决办法
516
查看次数

在包含 NULL 的列上使用 GROUP BY WITH ROLLUP

我有下表(在 SQL Fiddle 上查看)(我创建是为了解决我的问题):

| ID | word    |
----------------
| 5  | "Hello" |
| 6  |  NULL   |
| 7  | "World" |
| 8  | "World" |
Run Code Online (Sandbox Code Playgroud)

现在我想使用GROUP BY word WITH ROLLUP. ROLLUP 生成的行的列 word 中的 NULL 应替换为“total”:

SELECT
  ID,
  ifnull(word, "total") as word,
  count(*) as occurrences
FROM test
GROUP BY word WITH ROLLUP;
Run Code Online (Sandbox Code Playgroud)

问题是它还会用NULL单词为 NULL 的行数替换记录中的 :

| ID |  word | occurrences |
|----|-------|-------------|
|  6 | total | …
Run Code Online (Sandbox Code Playgroud)

mysql null group-by

6
推荐指数
1
解决办法
2万
查看次数