相关疑难解决方法(0)

PostgreSQL - 返回键值对数组的最佳方法

我正在尝试选择一些字段,其中一个字段需要是一个数组,数组的每个元素都包含两个值.每个数组项都需要包含名称(字符变化)和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数据提供程序?)

任何帮助深表感谢.

sql database postgresql npgsql

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

如何将两个PostgreSQL列聚合到由括号分隔的数组中

我想使用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)

我觉得我越来越近了,但是我会非常感激.

sql arrays postgresql concatenation array-agg

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

PostgreSQL:在group by子句中连接数组

我们有一个问题将数组分组到一个数组中.我们希望将两个列中的值连接到一个单独的数组中,并聚合这些多行的数组.

鉴于以下输入:

| 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)

sql arrays postgresql group-by postgresql-9.1

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

需要SQL优化(可能是DISTINCT ON的原因?)

相关的前一个问题:
在按值(而不是列)分组后,从组中选择一个随机条目?

我当前的查询如下所示:

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)

语义:

  1. 有两个输入值:

    • 第4行:点数组 array_of_points
    • 第12行:双精度数: distance
  2. 第一段(第1-6行):

    • 从points数组创建一个表,用于...
  3. 第二段(第8-14行):

    • 对于points表格内的每个点:从表格中获取一个距离< 的随机(!)groundtruthmeasurementdistance
    • 将这些元组保存在gtps表中
  4. 第三段(第16-19行):

    • 对于表中的每个groundtruthgtps:获取所有anchor_id …

sql postgresql postgis query-optimization aggregate-functions

5
推荐指数
1
解决办法
335
查看次数

如何使用array_agg()进行varchar []

我在我们的数据库中有一个名为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,但我只是不断收到这个错误:

ERROR:  could not find array type for data type character varying[]
Run Code Online (Sandbox Code Playgroud)

如果我删除了array_agg(se.min_crew)代码的一部分,我会得到一个带有user_sched_id = 2131和的表返回seids = '{623, 625}'.

sql arrays postgresql aggregate-functions multidimensional-array

5
推荐指数
1
解决办法
7021
查看次数

PostgreSQL:聚合文本数组

我想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[]

这里合适的方法是什么?我想要所有的单词,甚至是重复的单词。

postgresql

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