表'动物':
animal_name animal_type
Tom Cat
Jerry Mouse
Kermit Frog
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT
array_to_string(array_agg(animal_name),';') animal_names,
array_to_string(array_agg(animal_type),';') animal_types
FROM animals;
Run Code Online (Sandbox Code Playgroud)
预期结果:
Tom;Jerry;Kerimt, Cat;Mouse;Frog
OR
Tom;Kerimt;Jerry, Cat;Frog;Mouse
Run Code Online (Sandbox Code Playgroud)
我可以确定第一个聚合函数中的顺序将始终与第二个中的顺序相同.我的意思是我不想得到:
Tom;Jerry;Kermit, Frog;Mouse,Cat
Run Code Online (Sandbox Code Playgroud) 有没有人知道如何重写以下SQL查询来生成结果,那将只包含一次出现的名称?(按用户分组的结果).
查询
SELECT array_to_string(array_agg(CONCAT(u.firstname, ' ', u.lastname)), ', ')
FROM log_has_item logitem
INNER JOIN log log ON log.id = logitem.log_id
INNER JOIN worker u ON log.worker_id = u.id
WHERE logitem.company_id = 1
Run Code Online (Sandbox Code Playgroud)
可执行查询可在sqlfiddle.com上获得.单击Run SQL按钮,结果将包含两次Frantisek Smith
所以我有这张桌子:
create table test (
id integer,
rank integer,
image varchar(30)
);
Run Code Online (Sandbox Code Playgroud)
然后一些值:
id | rank | image
---+------+-------
1 | 2 | bbb
1 | 3 | ccc
1 | 1 | aaa
2 | 3 | c
2 | 1 | a
2 | 2 | b
Run Code Online (Sandbox Code Playgroud)
我想按id对它们进行分组,并按照rank排序顺序连接图像名称.在mySQL中,我可以这样做:
select id,
group_concat( image order by rank asc separator ',' )
from test
group by id;
Run Code Online (Sandbox Code Playgroud)
输出将是:
__PRE__有没有办法在postgresql中有这个?
如果我尝试使用array_agg(),名称将不会以正确的顺序显示,显然我无法找到对它们进行排序的方法.(我使用的是postgres 8.4)
我想使用group-by查询连接两列,从而产生一个用括号分隔的数组.我知道这个问题与这个问题有关,但像往常一样,我的用例有点不同.
一个简单的例子(也作为SQL Fiddle).目前我的查询返回以下内容:
ID X Y
3 0.5 2.71
3 1.0 2.50
3 1.5 2.33
6 0.5 2.73
6 1.5 2.77
Run Code Online (Sandbox Code Playgroud)
但是我希望连接/聚合X/ Y列以获得以下内容:
ID XY
3 [[0.5,2.71],[1.0,2.50],[1.5,2.33]]
6 [[0.5,2.73],[1.5,2.77]]
Run Code Online (Sandbox Code Playgroud)
目前我已经尝试将列连接成一个如下:
SELECT "ID",concat_ws(', ',"X", "Y") as XY FROM Table1;
Run Code Online (Sandbox Code Playgroud)
哪个回报:
ID xy
3 0.5, 2.71
3 1, 2.50
3 1.5, 2.33
6 0.5, 2.73
Run Code Online (Sandbox Code Playgroud)
用过array_agg():
SELECT "ID",array_to_string(array_agg("X"),',') AS XY
FROM Table1
GROUP BY "ID";
Run Code Online (Sandbox Code Playgroud)
导致:
ID xy
3 0.5,1,1.5
6 0.5
Run Code Online (Sandbox Code Playgroud)
我觉得我越来越近了,但是我会非常感激.
我有一个查询,它使用带有 distinct 作为参数的 array_agg 并且在 postgres 9.6 上不被接受。
我创建了这个示例来说明这个问题:
create table numbers (id integer primary key, name varchar(10));
insert into numbers values(1,'one');
insert into numbers values(2,'two');
Run Code Online (Sandbox Code Playgroud)
postgres 9.4
select array_agg(distinct(id)) from numbers;
array_agg
-----------
{1,2}
Run Code Online (Sandbox Code Playgroud)
postgres 9.6
ERROR: function array_agg(integer) is not unique
LINE 1: select array_agg(distinct(id)) from numbers;
^
HINT: Could not choose a best candidate function.
You might need to add explicit type casts.
Run Code Online (Sandbox Code Playgroud)
为了在 postgres 9.6 上获得这个结果,我需要改变什么?
谢谢。
这是我检查功能的结果:
nspname | proname | proargtypes
------------+-----------+---------------------
pg_catalog | …Run Code Online (Sandbox Code Playgroud) 在我的Postgres数据库中,我有3个表。一个用于users一个用于comments和一个映射两种user_comment_map。表格的外观如下:
users
| id | name | age |
|----|------|-----|
| 1 | user | 20 |
comments
| id | mood | subject | content | created_at |
|----|-------|---------|-----------------|--------------------------|
| 1 | happy | funny | here is content | Tue Sep 27 2016 13:44:19 |
| 2 | silly | cool | more content | Tue Sep 27 2016 14:44:19 |
user_comment_map
| id | user_id | comment_id |
|----|---------|------------|
| 1 …Run Code Online (Sandbox Code Playgroud) 我有一个Oracle 11g XE数据库,并且有一个查询结果集:
ID Category
1 Cat1
1 Cat2
2 Cat3
2 Cat4
Run Code Online (Sandbox Code Playgroud)
我想像这样用逗号分隔同一行中所有相关类别的唯一ID
ID Categories
1 Cat1,Cat2
2 Cat3,Cat4
Run Code Online (Sandbox Code Playgroud)
我以前使用过Postgres,并array_agg在那里提供了帮助。在Oracle 11g XE中如何获得相同的结果?
我为我的问题准备了一个SQL Fiddle -
给出下表:
CREATE TABLE chat(
gid integer, /* game id */
uid integer, /* user id */
created timestamptz,
msg text
);
Run Code Online (Sandbox Code Playgroud)
填充以下测试数据:
INSERT INTO chat(gid, uid, created, msg) VALUES
(10, 1, NOW() + interval '1 min', 'msg 1'),
(10, 2, NOW() + interval '2 min', 'msg 2'),
(10, 1, NOW() + interval '3 min', 'msg 3'),
(10, 2, NOW() + interval '4 min', 'msg 4'),
(10, 1, NOW() + interval '5 min', 'msg 5'),
(10, 2, …Run Code Online (Sandbox Code Playgroud) 这是我的 SQL:
SELECT t.uid, array_agg(t.place) FROM tour_tracking t WHERE (orderon::time BETWEEN '18:00:00' AND '20:00:00') GROUP BY t.uid;
原点结果:
|---------------|----------------------|
| uid | place |
|---------------|----------------------|
| a01 | {hk, hk, jp} |
|---------------|----------------------|
| a02 | {jp, jp, jp, jp, uk} |
|---------------|----------------------|
现在我想为每个分组的 uid 指望每个 DISTINCT 位置。希望的结果:
|---------------|--------------------------------------|
| uid | place |
|---------------|--------------------------------------|
| a01 | something like this: {hk,2, jp,1} |
|---------------|--------------------------------------|
| a02 | {jp:4, uk:1} |
|---------------|--------------------------------------|
我尝试组合一些count()sql 查询但不起作用..,如何进行正确的查询?
PostgreSQL 版本:10.3
我有一份学生和家长名单,想使用学生证将他们分组为家庭。拥有共同学生 ID 的家长可以被视为一个家庭,拥有共同家长 ID 的学生也可以被视为一个家庭。这是一个示例表:
p_id | parent_name | s_id | student_name |
------------------------------------------|
1 | John Doe | 100 | Mike Doe |
3 | Jane Doe | 100 | Mike Doe |
3 | Jane Doe | 105 | Lisa Doe |
5 | Will Willy | 108 | William Son |
Run Code Online (Sandbox Code Playgroud)
我想最终得到这样的结果:
parents | students |
-------------------|------------------------|
John Doe, Jane Doe | Mike Doe, Lisa Doe |
Will Willy | William Son |
Run Code Online (Sandbox Code Playgroud)
为了实现这一目标,我目前正在使用:
SELECT array_agg(parents) AS …Run Code Online (Sandbox Code Playgroud) array-agg ×10
postgresql ×10
sql ×6
group-by ×2
arrays ×1
count ×1
join ×1
knex.js ×1
oracle ×1
oracle11gr2 ×1
select ×1
sql-order-by ×1