小编Erw*_*ter的帖子

选择最长的连续序列

我正在尝试在 PostgreSQL 9.0 中构建一个查询,该查询获取特定列的最长连续行序列。

考虑下表:

lap_id (serial), lap_no (int), car_type (enum), race_id (int FK)
Run Code Online (Sandbox Code Playgroud)

lap_no每个(race_id, car_type). where都是独一无二的。

我希望查询为给定的race_idand生成最长的序列car_type,因此它将返回int最高的(或长的)。

使用以下数据:

1, 1, red, 1
2, 2, red, 1
3, 3, red, 1
4, 4, red, 1
5, 1, blue, 1
6, 5, red, 1
7, 2, blue, 1
8, 1, green, 1
Run Code Online (Sandbox Code Playgroud)

对于car_type = red and race_id = 1查询将5作为lap_no字段的最长序列返回。

我在这里发现了一个类似的问题但是我的情况更简单一些。

(我也想知道car_type …

postgresql window-functions gaps-and-islands postgresql-9.0

12
推荐指数
2
解决办法
9110
查看次数

Postgres:计数(*)与计数(id)

我在文档中看到了count(*)和之间的区别count(pk)。我一直在使用count(pk)(哪里pkSERIAL PRIMARY KEY)不知道count(*).

我的问题是关于 Postgres 的内部优化。是否足够聪明地发现 aSERIAL PRIMARY KEY将存在于每一行中并且永远不会为假并且只计算行数,或者它是否会对每一行进行冗余谓词检查?我同意这可能是一个毫无意义的优化,但我只是好奇。

我看了看输出EXPLAINEXPLAIN VERBOSEcount(*)count(id)count(id > 50)看看是否EXPLAIN提到检查其输出的断言。它没有。

postgresql optimization count

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

如何向 PostgreSQL 中的角色授予删除表/函数权限?

我想将drop特定数据库的特定架构中的所有表和函数(不仅是用户拥有的表和函数)的权限授予特定角色。但是,GRANT ALL PRIVILEGES这还不够,我没有找到如何在不将角色设为超级用户的情况下进行操作 - 超级用户对同一服务器上的其他数据库拥有权限,这不是我想要的。我不介意仅限于特定数据库的超级用户权限,但我不知道该怎么做。

我的代码:

CREATE USER _administrator PASSWORD 'pwd12345';
CREATE ROLE administrator NOLOGIN ADMIN _administrator;

GRANT ALL PRIVILEGES ON DATABASE "myDB" TO administrator;
GRANT ALL PRIVILEGES ON SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO administrator;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO administrator;
Run Code Online (Sandbox Code Playgroud)

administratormyDB数据库管理员组,_administrator是我的客户端应用程序能够以身份登录的最强大的角色。

我错过了什么或做错了什么?

postgresql permissions

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

如何使用 PLPGSQL 确定当前 search_path 中是否存在表?

我正在为一个应用程序编写一个安装脚本,该脚本是另一个应用程序的插件,所以我想检查另一个应用程序的表是否存在。如果没有,我想给用户一个有用的错误。但是,我不知道什么模式将保存这些表。

DO LANGUAGE plpgsql $$
BEGIN
    PERFORM 1
    FROM
        pg_catalog.pg_class c
        JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
    WHERE
        n.nspname = current_setting('search_path')
        AND c.relname = 'foo'
        AND c.relkind = 'r'; -- not sure if I actually need this or not...

    IF NOT FOUND THEN
        RAISE 'This application depends on tables created by another application';
    END IF;
END;
$$;
Run Code Online (Sandbox Code Playgroud)

但是,current_setting('search_path')返回"$user",public默认包含的 TEXT ,这不是很有用。

我唯一能想到的另一件事是尝试从表中选择并捕获异常。它可以完成这项工作,但我认为它不是很优雅,而且我读到它使用起来很昂贵(尽管在这种情况下可能没问题,因为我只运行一次?)。

postgresql plpgsql catalogs

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

在单个 SELECT 语句中返回多个范围的计数

我有一个 Postgres 数据库表foo,其中有一个score范围为 0 - 10的列。我想要一个查询来返回分数总数、0 到 3 之间的分数数、4 之间的分数数和 6,以及 7 到 10 之间的分数。类似于以下内容:

SELECT
  COUNT(*) as total,
  COUNT(
    SELECT * from foo where score between 0 and 3;
  ) as low,
  COUNT(
    SELECT * from foo where score between 4 and 6;
  ) as mid,
  COUNT(
    SELECT * from foo where score between 7 and 10;
  ) as high
FROM foo;
Run Code Online (Sandbox Code Playgroud)

我试过这个,但SELECTCOUNT语句中出现错误。任何想法我怎么能做到这一点?我确定 Postgres 中有一个超级简单的方法。我只是想不出 Google 的正确术语。

postgresql aggregate aggregate-filter

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

将两个事件表合并为一个时间线

给定两个表:

CREATE TABLE foo (ts timestamp, foo text);
CREATE TABLE bar (ts timestamp, bar text);
Run Code Online (Sandbox Code Playgroud)

我想编写一个查询,对于回报值tsfoo以及bar代表最新的值的统一视图。换句话说,如果foo包含:

ts | foo
--------
1  | A
7  | B
Run Code Online (Sandbox Code Playgroud)

bar包含:

ts | bar
--------
3  | C
5  | D
9  | E
Run Code Online (Sandbox Code Playgroud)

我想要一个返回的查询:

ts | foo | bar
--------------
1  | A   | null
3  | A   | C
5  | A   | D
7  | B   | D
9  | B …
Run Code Online (Sandbox Code Playgroud)

postgresql join window-functions

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

将 Postgres TIMESTAMP 转换为 TIMESTAMPTZ

我有一个在 Postgres 上运行的大小合适(约 50k 行)的时间序列数据库,还有一些其他结构化数据(在另一个数据库实例中)要小得多。

愚蠢的是,当我最初设计这个东西时,我把所有的字段都作为TIMESTAMP WITHOUT TIME ZONE,现在我用恼人的时区相关的错误来支付它。我希望一切都是明确的,所以想将字段转换为TIMESTAMP WITH TIME ZONE. 我意识到这不会存储额外的信息,并且我所有的时间戳都已经在 UTC 中,所以迁移应该是微不足道的,但我想知道是否有任何复杂的事情/潜在的绊倒块会证明有问题(这是一个生产客户依赖它的数据库)?

postgresql migration datatypes timezone

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

如何在 PostgreSQL 全文搜索中搜索带连字符的单词?

我必须搜索带连字符的单词,例如“早安”、“晚安”等。

我的查询是:

select id, ts_headline(content,
                       to_tsquery('english','good-morning'),
                       'HighlightAll=true MaxFragments=100 FragmentDelimiter=$') 
from table 
where ts_content @@ to_tsquery('english','good-morning');
Run Code Online (Sandbox Code Playgroud)

执行此查询时,我还会分别获得“good”“morning”的结果。但我想要完全匹配的单词和片段。
(因为ts_content我使用相同的默认配置english来创建tsvector.)

如何在 PostgreSQL 全文搜索中搜索此类带连字符的单词?

postgresql full-text-search pattern-matching

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

在 PostgreSQL 8.4 中执行触发器函数需要什么权限?

在 PostgreSQL 8.4 中执行触发器函数需要什么权限?

似乎为角色设置的权限与执行触发器功能无关。我想我有一天看到执行触发器函数所需的特权是 EXECUTE 特权,但对于表的所有者,而不是执行触发调用触发器函数的触发器的操作的实际角色。

我找不到解释这一点的文档部分,有什么帮助吗?

postgresql trigger stored-procedures permissions postgresql-8.4

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

PostgreSQL 相当于 MySQL 查询变量?

是否有一种直接的方法可以将这些类型的 MySQL 查询调整到 PostgreSQL:

  1. 在 MySQL 中设置变量,例如

    set @aintconst = -333
    set @arealconst = -9.999
    
    Run Code Online (Sandbox Code Playgroud)

    似乎不是

  2. 从 SELECT 查询中分配变量并随后在我的 SQL 中使用这些变量,例如:

     select @pfID := id from platform where bios like '%INTEL%'
     select @clientID := id from client where platformID = @pfID
    
    Run Code Online (Sandbox Code Playgroud)

我将非常感谢您的指点,尤其是在 (2) 上。

mysql postgresql

11
推荐指数
4
解决办法
6万
查看次数