相关疑难解决方法(0)

我如何(或可以)在多列上选择DISTINCT?

我需要检索表中的所有行,其中2列组合都是不同的.因此,我希望所有在同一天没有任何其他销售的销售以相同的价格出售.基于日期和价格的唯一销售将更新为活动状态.

所以我在想:

UPDATE sales
SET status = 'ACTIVE'
WHERE id IN (SELECT DISTINCT (saleprice, saledate), id, count(id)
             FROM sales
             HAVING count = 1)
Run Code Online (Sandbox Code Playgroud)

但是我的大脑比那更远了.

sql postgresql distinct duplicates sql-update

382
推荐指数
4
解决办法
86万
查看次数

按JSON数组中的匹配数查询和排序

jsonb在Postgres 9.4和Rails 的列中使用JSON数组,我可以设置一个范围,返回包含传递给范围方法的数组中的任何元素的所有行- 如下所示:

scope :tagged, ->(tags) {
  where(["data->'tags' ?| ARRAY[:tags]", { tags: tags }])
}
Run Code Online (Sandbox Code Playgroud)

我还想根据数组中匹配元素的数量来排序结果.

我很欣赏我可能需要超出ActiveRecord的范围才能做到这一点,所以一个vanilla Postgres SQL的答案也很有帮助,但如果它可以包含在ActiveRecord中,那么它可以是一个可链的范围.

根据要求,这是一个示例表.(实际架构要复杂得多,但这就是我所关心的.)

 id |               data                
----+-----------------------------------
  1 | {"tags": ["foo", "bar", "baz"]}
  2 | {"tags": ["bish", "bash", "baz"]}
  3 |
  4 | {"tags": ["foo", "foo", "foo"]}
Run Code Online (Sandbox Code Playgroud)

用例是基于标签查找相关内容.更多匹配标签更相关,因此结果应按匹配数量排序.在Ruby中,我有一个这样的简单方法:

Page.tagged(['foo', 'bish', 'bash', 'baz']).all
Run Code Online (Sandbox Code Playgroud)

哪个应按以下顺序返回页面:2, 1, 4.

postgresql activerecord ruby-on-rails ruby-on-rails-4 postgresql-9.4

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

在Postgres中将嵌套键值添加到JSONB

我试图将密钥附加到postgres中的嵌套jsonb中,但是出现错误。本质上,我从一个json开始:

{"tel": "123", "name": "foo", "new_info": {"a": "bar"}}
Run Code Online (Sandbox Code Playgroud)

并且我想附加{"b", "baz"}到“ new_info”中,使得结果jsonb为:

{"tel": "123", "name": "foo", "new_info": {"a": "bar", "b":"baz"}}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令来获取原始的jsonb:

CREATE TABLE mytable (
 ID serial NOT NULL PRIMARY KEY,
 data jsonb NOT NULL
);


INSERT INTO mytable (data)
VALUES
 (
 '{ "name": "foo", "tel": "123"}'
 );

UPDATE mytable SET data = jsonb_set(data, '{new_info}', '{"a":"bar"}', TRUE) WHERE data @> '{"name": "foo"}' ;
Run Code Online (Sandbox Code Playgroud)

并尝试使用以下命令来更新“ new_info”,该方法将不起作用:

WITH orig_new_info AS (SELECT data#>'{new_info}' FROM mytable WHERE data @> '{"name": "foo"}')
WITH updated_new_info …
Run Code Online (Sandbox Code Playgroud)

sql postgresql json jsonb

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