我有一个从表格中选择一些数据的功能。我想返回所选数据和该表中的总行数。
我怎样才能做到这一点,或者我怎样才能以最有效的方式获得相同的结果?
我尝试了几件事,最后得到了下面的代码,现在这是我想要的格式,但count(*) over () as total_count会一直返回 1,我需要它返回的是该records选择的总行数。
SELECT
row_to_json(selected_records) as data
FROM
(
SELECT
count(*) over () as total_count,
array_to_json(array_agg(row_to_json(records))) as data
FROM (
SELECT
sum(entrances) as entrances
FROM report_la
WHERE profile_id = 3777614
GROUP BY landing_path_id
limit 10 offset 0
) records
) as selected_records
Run Code Online (Sandbox Code Playgroud)
更新,下面的代码产生了我想要的结果,如果我可以total_count从records选择中隐藏该列就好了
SELECT
row_to_json(selected_records) as data
FROM
(
SELECT
min(total_count) as total_count
,array_to_json(array_agg(row_to_json(records))) as data
FROM (
SELECT
sum(entrances) as entrances
,count(*) over () as total_count …Run Code Online (Sandbox Code Playgroud) Postgresdate_trunc对timestampor进行操作interval,并且:
日期和时间类型的值分别自动转换为时间戳或间隔。
换句话说,我们可以使用date_trunc强制转换的date值:
select date_trunc('month',current_date)::date;
??????????????
? date_trunc ?
??????????????
? 2014-12-01 ?
??????????????
Run Code Online (Sandbox Code Playgroud)
但是这个时区是否安全——如果当前日期是夏令时而月份的开始不是,反之亦然会得到正确的日期吗?
我在以下查询中使用 Postgres:
select count(*) from image;
Run Code Online (Sandbox Code Playgroud)
此表上的主键是非递增的;它是存储在表中的图像的唯一序列号。我们的应用程序经常尝试摄取已经记录在数据库中的图像,因此主键/序列号确保它们只记录一次。
现在我们想知道是否应该使用递增的主键。我们在数据库中有 1,259,369 张图像,运行计数查询大约需要 7 分钟。
我们的应用程序永远不会从该表中删除图像 - 因此递增的主键将允许我们检查最后一个 ID 的值,该值等于表中的行数。
这真的是一个笼统的问题。
假设我有一个单一写入 DB 和多个读取 DB 复制从属的复制模式 - 我不必将 GUID 作为我的唯一 ID 字段。这是一个正确的假设吗?
如果我有多个数据库实例,其中所有实例都可写并且它们之间同步,则唯一 ID 字段中的 GUID 是强制性的。这也是正确的吗?
我正在 Amazon RDS 上设置 PostgreSQL。
谢谢。
我正在尝试确定图像数据库中至少贡献了五张图像的贡献者总数。以下查询将按贡献者提供图像计数,但这只是难题的一部分。我相信这对于比我有更多知识的人来说很简单:)
SELECT count(*) AS i_count,contributor_id FROM images GROUP BY contributor_id ORDER BY i_count DESC
我在 PostgreSQL 中有一个表,它描述了一些具有开始日期和结束日期的事件:
CREATE TABLE my_table
(
event_id serial NOT NULL,
start_date timestamp without time zone NOT NULL,
end_date timestamp without time zone NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
单个事件可能与前一个和下一个事件重叠。在下表中,4 个事件中的前 3 个形成连续的时间间隔:
1 '2015-04-02 22:09:03' '2015-04-02 22:19:05'
2 '2015-04-02 22:17:38' '2015-04-02 22:27:38'
3 '2015-04-02 22:25:21' '2015-04-02 22:36:23'
4 '2015-04-02 22:45:23' '2015-04-02 22:55:23'
Run Code Online (Sandbox Code Playgroud)
是否可以编写一个查询来检查两个给定日期之间是否存在连续的日期间隔?
我想要一些类似的东西:
select ...
from my_table
where start_date > '2015-04-02' and end_date < '2015-04-06'
Run Code Online (Sandbox Code Playgroud) 我想我们的PostgreSQL 9.4的事务级数据库迁移READ COMMITTED要么REPEATABLE READ或SERIALIZABLE。在任何一种情况下,我都会遇到一组新的格式错误:
(for both)
ERROR: could not serialize access due to concurrent update
(just for SERIALIZABLE)
ERROR: could not serialize access due to read/write dependencies among transactions
Run Code Online (Sandbox Code Playgroud)
在阅读了 SSI 上的 wiki 页面和文档后,我彻底了解了可能导致这些错误的错误条件、如何处理它们,甚至是避免它们的最佳实践。
但是,我看不到从 PostgreSQL 可以提供的任何调试输出或任何调试信息中确定导致它们的数据依赖性的方法。有没有办法从数据库中获取这些信息,要么在回滚时执行额外的查询,要么通过某种日志机制?
有了这些信息,我就可以进行应用程序级别的更改(锁定、不同的查询等),从而消除一些数据竞争以避免过多的回滚。
我正在阅读一本 postgresql 书(从新手到专业版的 PostgreSQL),它说您可以通过调用作为安装一部分的 postgres 二进制文件来启动 postmaster 守护进程:
/usr/lib/postgresql/9.3/bin/postgres "-D" "/var/lib/postgresql/9.3/main" "-c" "config_file=/etc/postgresql/9.3/main/postgresql.conf"
Run Code Online (Sandbox Code Playgroud)
请注意,我们必须将数据目录和配置作为参数传递给 postgres 二进制文件。
然后这本书继续说 pg_ctl 可执行文件,当通过 apt-get 安装时,它也恰好存储在 /usr/lib/postgresql/9.3/bin 目录中,用于简化任务。但我无法让 pg_ctl 运行:
$ /usr/lib/postgresql/9.3/bin/pg_ctl -D "/var/lib/postgresql/9.3/main" start
server starting
postgres@estonia:/usr/lib/postgresql/9.3/bin$ postgres cannot access the server configuration file "/var/lib/postgresql/9.3/main/postgresql.conf": No such file or directory
Run Code Online (Sandbox Code Playgroud)
它说找不到配置文件,但是这里没有办法指定配置文件:
$ /usr/lib/postgresql/9.3/bin/pg_ctl start "-D" "/var/lib/postgresql/9.3/main" "-c" "config_file=/etc/postgresql/9.3/main/postgresql.conf"
pg_ctl: too many command-line arguments (first is "start")
Try "pg_ctl --help" for more information.
Run Code Online (Sandbox Code Playgroud)
如何让 pg_ctl 运行?
我的 postgreSQL 中有一个 Wordpress 数据库,在 phppgadmin 中,该数据库的大小为 273 MB。
我跑sudo -u postgres pg_dump -Fp -f wordpress.sql wordpress做数据库备份,结果是一个只有 18MB 的文件。
我已将原始数据库的名称更改为 Wordpress2,然后:
我创建了一个名为 Wordpress 的新数据库并进行了恢复sudo -u postgres psql wordpress < wordpress.sql ,结果是一个大小为 19 MB 的数据库,是否缺少某些内容?
下面是phppgadmin的打印,wordpress作为导入的备份,wordpress2作为原始数据库。

自动吸尘器
postgres=# select setting from pg_settings where name = 'autovacuum';
setting
---------
on
(1 row)
Run Code Online (Sandbox Code Playgroud)
索引空间
postgres=# select pg_size_pretty(sum(pg_relation_size(indexrelid))) from pg_index;
pg_size_pretty
----------------
2600 kB
(1 row)
Run Code Online (Sandbox Code Playgroud)
原始数据库大小
postgres=# select pg_size_pretty(pg_database_size('wordpress2'));
pg_size_pretty
----------------
273 MB
(1 row)
Run Code Online (Sandbox Code Playgroud)
已恢复
postgres=# select pg_size_pretty(pg_database_size('wordpress'));
pg_size_pretty …Run Code Online (Sandbox Code Playgroud) 我正在查看 pg_stat_activity 视图。有两个领域对我来说是无法区分的:
xact_start:事务开始运行的时间,可能与 query_start 不同,但应始终发生在 query_start 时间之前。
query_start:查询开始运行的时间。这对于确定查询是否已运行很长时间很有用。
它说它们都决定了查询的开始时间。它还说 xact_start 可以与 query_start 不同,但没有解释为什么 - 只是它应该在 query_start 之前启动。但两者之间的实际区别是什么?为什么我会关心 xact_start?