【问题标题】:How to select in Postgresql difference between arrays in rows?如何在 Postgresql 中选择行中数组之间的差异?
【发布时间】:2017-07-27 09:46:18
【问题描述】:

我有一张桌子

CREATE TABLE people
(
  id bigserial NOT NULL,
  name text
  hobbies text[]
)

这里的数据每天都会被插入。

现在我的行​​数很少。我想得到行之间的爱好数组的差异。

例如

id |name | hobbies
1   Tom    [fishing, hunting, football]
2   James  [fishing, jogging]
3   Dave   [football, computer games]

我会将第一行与第二行进行比较,将第二行与第三行进行比较(第一行中的内容不在第二行中)。所以结果是:

hobbies
[hunting, football, fishing, jogging]

我想检索数组内的差异数组。

【问题讨论】:

  • 为什么结果只有一行?每个ID不应该有一行吗?即(id_1,hobbies_1 - hobbies_2),(id_2,hobbies_2 - hobbies_3),...?
  • 每个条目我有 2000 个元素,所以我把它放在数组中。爱好只是一个例子。这些元素都是坐标,所以如果不改变它们总是唯一的。

标签: sql arrays postgresql


【解决方案1】:

如果您希望每行有一行差异,您可以使用EXCEPT 和LEAD() 的组合:

SELECT id, ARRAY_AGG(diff_hobbies)
FROM
(
  SELECT id, unnest(hobbies)
  FROM people
  EXCEPT
  SELECT id, unnest(LEAD(hobbies) OVER (ORDER BY id))
  FROM people
) t(id, diff_hobbies)
GROUP BY id
;
┌────┬─────────────────────────────┐
│ id │          array_agg          │
├────┼─────────────────────────────┤
│  1 │ {football,hunting}          │
│  2 │ {jogging,fishing}           │
│  3 │ {football,"computer games"} │ 
└────┴─────────────────────────────┘
(3 rows)

【讨论】:

  • 这可能有效。是否有可能以一种不会反汇编该数组内的数组的方式使用 unnest?
  • 按预期工作。谢谢! @Marth
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
相关资源
最近更新 更多