我有一张桌子,上面有字段utm和tracking_id。tracking_id每个可能有多个utm。因此,我需要选择不同的utm和每个utm的任何一个跟踪ID(让我们说第一个)。
例如,我们得到了表:
utm | tracking_id
-------------------
ddff | 1
ddff | 2
llzz | 3
ddff | 4
ohoh | 5
ohoh | 6
Run Code Online (Sandbox Code Playgroud)
作为输出,我想得到:
utm | tracking_id
-------------------
ddff | 1
llzz | 3
ohoh | 5
Run Code Online (Sandbox Code Playgroud)
我使用PostgreSQL 9.1。
有没有办法用SQL做到这一点?
我想在 postgresql 中插入时间数据类型,其中包括时区并了解夏令时。这就是我所做的:
CREATE TABLE mytable(
...
start_time time(0) with time zone,
end_time time(0) with time zone
)
INSERT INTO mytable(start_time, end_time)
VALUES(TIME '08:00:00 MST7MDT', TIME '18:00:00 MST7MDT')
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
时间类型的输入语法无效:“08:00:00 MST7MDT”
如果我使用“MST”而不是“MST7MDT”,它就可以工作,但我需要它了解夏令时。我还尝试使用“美国/埃德蒙顿”作为时区,但出现了同样的错误。
插入带有时区和 DST 的时间值(不是时间戳)的正确方法是什么?
编辑:我实际上想使用“美国/埃德蒙顿”语法
我有real列类型带有示例值的表:
123456,12
0,12345678
Run Code Online (Sandbox Code Playgroud)
和存储过程中的代码:
CREATE OR REPLACE FUNCTION test3()
RETURNS integer AS
$BODY$
DECLARE
rec RECORD;
BEGIN
FOR rec IN
SELECT
gme.abs_km as km,
CAST(gme.abs_km as numeric) as cast,
round(gme.abs_km:: numeric(16,2), 2) as round
FROM gps_entry gme
LOOP
RAISE NOTICE 'Km: % , cast: % , round: %', rec.km, rec.cast, rec.round;
INSERT INTO test (km, casting, rounding) VALUES (rec.km, rec.cast, rec.round);
END LOOP;
RETURN 1;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Run Code Online (Sandbox Code Playgroud)
输出如下:
2014-02-05 12:49:53欧洲中部通知:公里:0.12345678,演员:0.123457,回合:0.12 2014-02-05 12:49:53欧洲中部通知:公里:123456.12,演员:123456,回合:123456.00
具有列的数据库表NUMERIC(19,2): …
我对行号使用求和窗口函数,类似于此查询-
SELECT field_a,
SUM(1) OVER (PARTITION BY field_b ORDER BY field_c ASC ROWS UNBOUNDED PRECEDING) AS row_number
FROM test_table
ORDER BY row_number;
Run Code Online (Sandbox Code Playgroud)
问题在于,如果field_c为空值,它将显示在末尾。我在一开始就想要它,因此将null值视为小于所有其他值。在Oracle中,可以通过提供NULLS FIRST参数来实现,但是Redshift不支持该参数。那么如何在Redshift中实现它呢?
我在PostgreSQL中有一个表:
CREATE TABLE tableA
(
time_A time with timezone
);
Run Code Online (Sandbox Code Playgroud)
如何获得now()和之间的分钟差异time_A?
我有一张桌子years(每只耳朵的1号).我想创建一个函数,它接受这些年中的每一年并在另一个表上运行查询来计算属于该年份的行数.我尝试用pl/pgsql实现,使用下面的代码,但我没有让它工作或在Internet上找到任何引用.
CREATE or REPLACE FUNCTION func_test(in AAA date, OUT _result int)
BEGIN
SELECT SUM(st_length(geom)) as BBB
FROM hist_line
WHERE '2006-01-01' BETWEEN valid_from AND COALESCE(valid_to, '9999-12-31');
RETURN _result BBB;
END;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION func_test(date)
select func_test('2009-01-01');
Run Code Online (Sandbox Code Playgroud)
我无法将函数内部的内容查询恢复为函数的输出.
我有一个表,其中一些记录将特定属性设置为非空值.我想获取这些记录之后的所有记录(按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窗口函数的内容,这里可能很有用,但我不确定在这种情况下如何使用它.
我有一个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)
结果应该是不同的列名。
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 添加索引。
我正在尝试在 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) postgresql ×10
sql ×8
datetime ×2
plpgsql ×2
sql-order-by ×2
dst ×1
group-by ×1
hasura ×1
knn ×1
null ×1
sql-function ×1
timezone ×1
types ×1