我正在尝试选择一些字段,其中一个字段需要是一个数组,数组的每个元素都包含两个值.每个数组项都需要包含名称(字符变化)和ID(数字).我知道如何返回单个值的数组(使用ARRAY
关键字),但我不确定如何返回一个对象的数组,该对象本身包含两个值.
查询是这样的
SELECT
t.field1,
t.field2,
ARRAY(--with each element containing two values i.e. {'TheName', 1 })
FROM MyTable t
Run Code Online (Sandbox Code Playgroud)
我读到一种方法是通过选择一个类型的值,然后创建该类型的数组.问题是,函数的其余部分已经返回一个类型(这意味着我会有嵌套类型 - 是吗?如果是这样,你将如何在应用程序代码中读回这些数据 - 即使用像NPGSQL这样的.Net数据提供程序?)
任何帮助深表感谢.
我想使用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)
我觉得我越来越近了,但是我会非常感激.
我们有一个问题将数组分组到一个数组中.我们希望将两个列中的值连接到一个单独的数组中,并聚合这些多行的数组.
鉴于以下输入:
| id | name | col_1 | col_2 |
| 1 | a | 1 | 2 |
| 2 | a | 3 | 4 |
| 4 | b | 7 | 8 |
| 3 | b | 5 | 6 |
Run Code Online (Sandbox Code Playgroud)
我们想要以下输出:
| a | { 1, 2, 3, 4 } |
| b | { 5, 6, 7, 8 } |
Run Code Online (Sandbox Code Playgroud)
元素的顺序很重要,应该与聚合行的id相关联.
我们尝试了array_agg函数:
SELECT array_agg(ARRAY[col_1, col_2]) FROM mytable GROUP BY name;
Run Code Online (Sandbox Code Playgroud)
不幸的是,这句话引发了一个错误:
ERROR: …
Run Code Online (Sandbox Code Playgroud) 相关的前一个问题:
在按值(而不是列)分组后,从组中选择一个随机条目?
我当前的查询如下所示:
WITH
points AS (
SELECT unnest(array_of_points) AS p
),
gtps AS (
SELECT DISTINCT ON(points.p)
points.p, m.groundtruth
FROM measurement m, points
WHERE st_distance(m.groundtruth, points.p) < distance
ORDER BY points.p, RANDOM()
)
SELECT DISTINCT ON(gtps.p, gtps.groundtruth, m.anchor_id)
m.id, m.anchor_id, gtps.groundtruth, gtps.p
FROM measurement m, gtps
ORDER BY gtps.p, gtps.groundtruth, m.anchor_id, RANDOM()
Run Code Online (Sandbox Code Playgroud)
语义:
有两个输入值:
array_of_points
distance
第一段(第1-6行):
第二段(第8-14行):
points
表格内的每个点:从表格中获取一个距离< 的随机(!)groundtruth
点measurement
distance
gtps
表中第三段(第16-19行):
groundtruth
值gtps
:获取所有anchor_id …
sql postgresql postgis query-optimization aggregate-functions
我在我们的数据库中有一个名为min_crew
具有不同字符数组的列,例如'{CA, FO, FA}'
.
我有一个查询,我试图获取这些数组的聚合但没有成功:
SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
, array_agg(se.min_crew)
FROM base.sched_entry se
LEFT JOIN base.user_sched_entry use ON se.sched_entry_id = use.sched_entry_id
WHERE se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP BY user_sched_id;
Run Code Online (Sandbox Code Playgroud)
623和625都有相同的use.user_sched_id
,所以结果应该是seid的分组和min_crew
,但我只是不断收到这个错误:
Run Code Online (Sandbox Code Playgroud)ERROR: could not find array type for data type character varying[]
如果我删除了array_agg(se.min_crew)
代码的一部分,我会得到一个带有user_sched_id = 2131
和的表返回seids = '{623, 625}'
.
sql arrays postgresql aggregate-functions multidimensional-array
我想id
在此示例数据中获取与每个单词相关联的所有单词的数组:
id | words
---|------------------
1 | {foo,bar,zap,bing}
2 | {foo}
1 | {bar,zap}
2 | {bing}
1 | {bing}
2 | {foo,bar}
Run Code Online (Sandbox Code Playgroud)
输出:
id | allwords
---|--------------------------------
1 | {foo,bar,zap,bing,bar,zap,bing}
2 | {foo,bing,foo,bar}
Run Code Online (Sandbox Code Playgroud)
我尝试使用,array_agg(words)
但它产生:
ERROR: could not find array type for data type text[]
这里合适的方法是什么?我想要所有的单词,甚至是重复的单词。