我有一项任务是将数组、记录以及在某些情况下的记录数组作为参数传递给 PostgreSQL 中的函数。
我正在尝试在 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_id
and生成最长的序列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 …
我偶然得到了这个:
db=> select name from site;
ERROR: column "name" does not exist
LINE 1: select name from site;
^
db=> select site.name from site;
name
---------------
(1,mysitename)
(1 row)
Run Code Online (Sandbox Code Playgroud)
第二个查询返回一个包含整行的元组。使用 postgres 9.0.1。
编辑:按请求定义站点。我真的不重要,这个怪癖适用于任何桌子。
db=> \d site
Table "public.site"
Column | Type | Modifiers
--------+---------+---------------------------------------------------
id | integer | not null default nextval('site_id_seq'::regclass)
title | text | not null
Run Code Online (Sandbox Code Playgroud) 我正在使用 Postgresql 9.0。我在表中有以下字段:id, name
.
id name
1 John
1 Mary
1 Mary
1 Mary
1 John
1 Mary
3 Paul
3 Paul
3 George
. .
. .
Run Code Online (Sandbox Code Playgroud)
对于每个id
,我想选择出现次数最多的名称。我怎样才能做到这一点?
我尝试使用以下查询,但它不起作用:
select id, max(name)
from table
group by id;
Run Code Online (Sandbox Code Playgroud) 我自己有一个相当复杂的问题,我希望有人可以帮助我。
我想使用 PostgreSQL 来从无几何表创建数据透视表。
为了简单起见,我将只显示我想要用于枢轴的表结构,然后使用给出的方法来创建其他表结构,我希望:)
我想使用的字段是postcode_nospace_
, 和ageband
。
ageband
顶部的列是行,postcode_nospace_
每个邮政编码的计数是数据。
有 2132 条记录,其中一些记录有多个邮政编码,因此计数。
CREATE TABLE adult_social_care.activities_in_localities_asc
(
ogc_fid integer NOT NULL,
sort numeric(5,0),
ageband character(12),
postcode_nospace_ character(8),
wkb_geometry geometry,
CONSTRAINT activities_in_localities_asc_pkey PRIMARY KEY (ogc_fid)
);
Run Code Online (Sandbox Code Playgroud)
更新:
这是我想要实现的结果,如具有相同数据的 Excel 数据透视表所示。
postcode 18_24 25_34 35_44 45_54 55_64 65_74 Total Count
----------------------------------------------------------------------------
BB115DE 1 2 2 3 8
FY38LZ 1 1 2
Run Code Online (Sandbox Code Playgroud)
通过环顾四周,我编译了以下 SQL 查询。它按邮政编码分组并创建所需的字段名称。但是这些字段是空白的。理想情况下,我还希望total_count
在表格末尾有一列。
SELECT * FROM crosstab(
'SELECT postcode_nospace_, ageband, count(ageband) as total_count
FROM …
Run Code Online (Sandbox Code Playgroud) 我有一个大表测试,其中 user_id 2 有 500000 条记录。所以我想以 100 条记录为单位删除这条记录,但出现错误。这是我的查询:
delete from test where test_id in (select test_id
from test where User_id = 2 limit 100 )
Run Code Online (Sandbox Code Playgroud)
错误:元组同时更新
这是什么问题。我怎样才能解决它。
我们的 PostgreSQL 9.0 Windows 生产服务器空间不足。
在我们的 100GB 数据库中,我们有一个包含 TOAST 二进制数据的大表。我们删除了一些行,需要将空间归还给 O/S。
我们没有足够的空间做表的全部重写,所有我的读书CLUSTER
,VACUUM FULL
而且pg_repack
是他们需要重写表。到目前为止,我的 google-fu 还不足以找到其他任何东西。
一些停机时间是可以接受的(约 2 小时),但是备份/恢复对于我们的目的来说太慢了,我也不热衷于在步骤之间删除数据库。
问题:如何在不进行全表重写的情况下将磁盘空间返回给 O/S?
(这是一个生产服务器,因此任何解决方案都必须有信誉/推荐/支持等)。
(PS 可以使用一个单独的更大的磁盘,如果可以以某种方式在其上重建表。表空间?)
我试图在 Postgres 9.0 的 PostGIS 中填充一个视图,在这个视图中我希望它包含一个基于 2 个字符串位置的子字符串。请参阅下面的我的代码。
CREATE OR REPLACE VIEW vw_actions AS
SELECT ls.f_table_schema, ls.f_table_name,
(SELECT substr(ls.attribute_actions_text,
strpos(ls.attribute_actions_text, 'name="')+6,
strpos(ls.attribute_actions_text, '"/>') -
strpos(ls.attribute_actions_text, 'name="'))) AS actions
FROM layer_styles ls;
Run Code Online (Sandbox Code Playgroud)
结果是它在使用 strpos 时不喜欢负数。我可以让它前进 6 个字符以从返回的子字符串中删除 'name="' 但不能删除 '"/>'。
它返回以下内容:
View SHED Database"/>
Run Code Online (Sandbox Code Playgroud)
我希望它返回的地方:
View SHED Database
Run Code Online (Sandbox Code Playgroud)
任何建议将不胜感激。
补充:我发现如果我使用 9.1,我可以使用 strposrev 并且我认为以下代码会起作用:
CREATE OR REPLACE VIEW vw_actions AS
SELECT ls.f_table_schema, ls.f_table_name,
(SELECT substr(ls.attribute_actions_text::text,
strpos(ls.attribute_actions_text::text, 'name="'::text)+6,
strposrev(ls.attribute_actions_text::text, '"/>'::text)+3 -
strpos(ls.attribute_actions_text::text, 'name="'::text))) AS actions
FROM layer_styles ls;
Run Code Online (Sandbox Code Playgroud) 继我之前的问题之后:
在 PostgreSQL 9.0 中创建 crosstab() 数据透视表
我设法创建了一个数据透视表来ageband
使用该crosstab()
函数。我可以使用它来创建基本无几何表的视图或表。
但是,这仍然没有多大用处,因为我需要将其链接到gazetteers_and_addresses.unit_postcode
表格以分配几何图形以进行进一步分析。
我将附上两个表的表结构和用于创建交叉表的原始代码。
CREATE OR REPLACE VIEW adult_social_care.vw_ageband AS (
SELECT * FROM crosstab(
'SELECT postcode_nospace_, ageband, count(ageband) as total_count
FROM adult_social_care.activities_in_localities_asc
GROUP BY postcode_nospace_, ageband
ORDER BY postcode_nospace_'
,$$VALUES ('18-24'::text), ('25-34'), ('35-44'), ('45-54'), ('55-64'), ('65-74'), ('75-84'), ('85-94'), ('95 AND OVER')$$)
AS ct("postcode" text, "18-24" numeric, "25-34" numeric,"35-44" numeric, "45-54" numeric, "55-64" numeric, "65-74" numeric, "75-84" numeric, "85-94" numeric, "95 AND OVER" numeric));
Run Code Online (Sandbox Code Playgroud)
表定义:
activities_in_localities_asc
:
CREATE …
Run Code Online (Sandbox Code Playgroud) postgresql ×9
pivot ×2
array ×1
cte ×1
datatypes ×1
disk-space ×1
functions ×1
vacuum ×1
view ×1
windows ×1