小编Erw*_*ter的帖子

如何在PostgreSQL中设置了特定属性的每条记录之后获取第一条记录?

我有一个表,其中一些记录将特定属性设置为非空值.我想获取这些记录之后的所有记录(按created_at列排序).

这是样本数据:

id | factor | created_at
 1 | NULL   | 2001-01-01
 2 | 1.2    | 2001-01-02
 3 | NULL   | 2001-01-03
 4 | NULL   | 2001-01-04
 5 | 0.9    | 2001-01-05
 6 | NULL   | 2001-01-06
 7 | 1.1    | 2001-01-07
 8 | NULL   | 2001-01-08
 9 | NULL   | 2001-01-09
10 | 1.1    | 2001-01-10
11 | NULL   | 2001-01-11
Run Code Online (Sandbox Code Playgroud)

等等.在这种情况下,我想获取ID为3,6,8和11的记录.在PostgreSQL 9.3中它是否可行?在真正的应用程序ids不一定是顺序 - 也有user_id列,我只获取具有相同user_id值的记录.我已经阅读了一些关于LEAD窗口函数的内容,这里可能很有用,但我不确定在这种情况下如何使用它.

sql postgresql window-functions

0
推荐指数
1
解决办法
147
查看次数

获取两行之间不同的列

我有一个company60 列的表。目标是创建一个工具来查找、比较和消除此表中的重复项。

示例:我找到 2 家可能相同的公司,但我需要知道这两行之间哪些值(列)不同才能继续。

我认为可以逐列比较 x 60,但我寻找更简单、更通用的解决方案。

就像是:

SELECT * FROM company where co_id=22
SHOW DIFFERENCE
SELECT * FROM company where co_id=33
Run Code Online (Sandbox Code Playgroud)

结果应该是不同的列名。

postgresql duplicate-removal postgresql-9.1

0
推荐指数
1
解决办法
1796
查看次数

类型枚举的数组从Postgres作为字符串返回

给定一个自定义枚举: CREATE TYPE vehicle AS ENUM ('car', 'truck', 'bicycle');

像这样的表:

CREATE TABLE vehicle_events (
  timestamp timestamptz NOT NULL DEFAULT current_timestamp,
  labels vehicle[] NOT NULL,
  mentions int4[] NOT NULL DEFAULT '{}'
);
Run Code Online (Sandbox Code Playgroud)

当这样从我们的节点应用程序中查询时:

SELECT * FROM vehicle_events;

这将返回一个json结构,如下所示:

[{"timestamp": "January, 06 2016 23:04:56", "labels": "{'car'}", "mentions": [1,2,3,4]}]

我的问题确实是,为什么labels数组以字符串形式返回(还请注意,提到的base类型的数组不是)?这是因为它是一个数组ENUM吗?如果是这样,如何将其强制放入常规数组中?为什么postgres以这种方式退回它?

sqlfiddle链接:http ://sqlfiddle.com/#!15/637ce/1

postgresql node.js node-postgres

0
推荐指数
1
解决办法
528
查看次数

PostgreSQL 相当于从 Oracle 插入的内容是什么?

我想创建一个触发器来捕获INSERTUPDATE根据操作执行某些操作。在 Oracle 中可以这样做:

CREATE OR REPLACE TRIGGER ABC_BIU BEFORE INSERT OR UPDATE ON ABC
FOR EACH ROW
BEGIN
  IF INSERTING THEN
    ...
  END IF;

 ...
END;
Run Code Online (Sandbox Code Playgroud)

这里提到that是Oracle中INSERTING与the结合使用的一个关键字,在这里你可以看到用法:TRIGGER

IF INSERTING THEN ... END IF;
IF UPDATING THEN ... END IF;
Run Code Online (Sandbox Code Playgroud)

oracle postgresql triggers plpgsql database-trigger

0
推荐指数
1
解决办法
1368
查看次数

从时间戳列中删除时间部分

我这里需要专家的帮助。我有一个数据类型为“Actual_Date”的列timestamp。它的格式为:

yyyy - mm - dd 00:00:00 
Run Code Online (Sandbox Code Playgroud)

我想将列转换为以下格式:

mm - dd - yyyy 
Run Code Online (Sandbox Code Playgroud)

如何转换日期?

sql postgresql types

0
推荐指数
1
解决办法
8924
查看次数

计算两个日期之间的工作日数

我正在尝试获取 plpgsql 中两个日期之间的工作日数。以下是我的代码:

CREATE FUNCTION weekdays(DATE, DATE) RETURNS INTEGER AS
$$
DECLARE
    d date := $1;
    weekdays integer := 0
BEGIN

LOOP
    IF select extract(dow from date d) != 6 or select extract(dow from date d) != 0
      weekdays := weekdays +1
    END IF
    d := d + 1;
    EXIT WHEN d > $2;
END LOOP;
RETURN weekdays;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)

但是,我不断收到以下错误:

Unterminated dollar quote started at position 56 in SQL
CREATE FUNCTION weekdays(DATE, DATE) RETURNS INTEGER AS …
Run Code Online (Sandbox Code Playgroud)

postgresql time-series plpgsql

0
推荐指数
1
解决办法
2908
查看次数

如何优化结合了 INNER JOIN、DISTINCT 和 WHERE 的 SQL 查询?

SELECT DISTINCT options.id, options.foo_option_id, options.description
FROM vehicles 
INNER JOIN vehicle_options     ON vehicle_options.vehicle_id = vehicles.id 
INNER JOIN options             ON options.id = vehicle_options.option_id 
INNER JOIN discounted_vehicles ON vehicles.id = discounted_vehicles.vehicle_id 
WHERE discounted_vehicles.discount_id = 4;
Run Code Online (Sandbox Code Playgroud)

上面的查询返回 2067 行,它在 1.7 秒内在本地运行。我想知道它是否尽可能快,或者我是否可以以某种方式进一步调整它,因为这个数据集会随着时间的推移而快速增长。

我在速度不变的情况下尝试过的事情:

1 - 更改连接顺序,从最小的表连接到最大的表。

2 - 向discounted_vehicles.discount_id 添加索引。

sql postgresql postgresql-performance

0
推荐指数
1
解决办法
2217
查看次数

如果另一列为空,禁止用户更新列?

我有mytable其中有3个整数字段:id,status,project_id.

我已经告诉人们,在给它赋值之前,他们不应该在4点之前进展状态project_id.当然人们不听,然后就会出现问题.

如果有人在project_id列是否尝试从状态4更新到5时有没有办法返回错误null?我仍然需要人们能够将状态从2或3更新到状态4,无论它有什么project_id.

sql postgresql triggers constraints

0
推荐指数
1
解决办法
43
查看次数

在 Postgres 中通过相同的列值将行转换为列

我有一个像这样的表:

id     name    value
--------------------
1      x       100
1      y       200
1      z       300
2      x       10
2      y       abc
2      z       001
3      x       1
...
--------------------
Run Code Online (Sandbox Code Playgroud)

我需要将其转换为类似的东西:

id    x     y     z
---------------------
1     100   200   300
2     10    abc   001
3     1     ...
---------------------
Run Code Online (Sandbox Code Playgroud)

名字已确定。我可以进行多个连接,但我正在寻找更优雅的解决方案。

sql postgresql pivot crosstab

0
推荐指数
1
解决办法
5720
查看次数

如何按子查询中的非聚合列排序?

我正在尝试在 Hasura 中创建一个函数来查询用户附近的帖子。我得到了那个工作,但我也想订购这些帖子。我收到一个 Postgres 错误,内容为:

“postgres-error : 列“b.Volume”必须出现在 GROUP BY 子句中或用于聚合函数中”

我是 Hasura 和 Postgres 的新手,我不确定您是否被允许做这样的事情。这是我的代码:

CREATE OR REPLACE FUNCTION public.search_posts_near_user(id uuid, distance_kms integer, volume integer)
 RETURNS SETOF user_posts
 LANGUAGE sql
 STABLE
AS $function$
  SELECT  A.id, A.location,
  (SELECT json_agg(row_to_json(B)) FROM "Posts" B
   WHERE (
     ST_Distance(
       ST_Transform(B.location::Geometry, 3857),
       ST_Transform(A.location::Geometry, 3857)
     ) /1000) < distance_kms AND B."Volume" < volume
    ORDER BY B."Volume" Desc
   ) AS nearby_Posts
  FROM users A where A.id = id
$function$
Run Code Online (Sandbox Code Playgroud)

sql postgresql sql-order-by knn hasura

0
推荐指数
1
解决办法
56
查看次数