有没有人知道如何在PostgreSQL中创建交叉表查询?
例如,我有下表:
Section Status Count
A Active 1
A Inactive 2
B Active 4
B Inactive 5
Run Code Online (Sandbox Code Playgroud)
我想查询返回以下交叉表:
Section Active Inactive
A 1 2
B 4 5
Run Code Online (Sandbox Code Playgroud)
这可能吗?
由于Postgres能够进行LATERAL连接,我一直在阅读它,因为我目前为我的团队执行复杂的数据转储,其中包含大量低效的子查询,这使得整个查询需要四分钟或更长时间.
我知道LATERAL联接可能能够帮助我,但即使在阅读了像Heap Analytics 这样的文章之后,我仍然没有完全遵循.
LATERAL加入的用例是什么?LATERAL连接和子查询之间有什么区别?
我有这样的查询,很好地生成两个给定日期之间的一系列日期:
select date '2004-03-07' + j - i as AllDate
from generate_series(0, extract(doy from date '2004-03-07')::int - 1) as i,
generate_series(0, extract(doy from date '2004-08-16')::int - 1) as j
Run Code Online (Sandbox Code Playgroud)
它在2004-03-07和之间生成162个日期2004-08-16,这就是我想要的.这段代码的问题是,它不会得到正确的答案时,这两个日期都不同年份,例如,当我尝试2007-02-01和2008-04-01.
有更好的解决方案吗?
我有一个看起来像这样的表:
id feh bar
1 10 A
2 20 A
3 3 B
4 4 B
5 5 C
6 6 D
7 7 D
8 8 D
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像这样:
bar val1 val2 val3
A 10 20
B 3 4
C 5
D 6 7 8
Run Code Online (Sandbox Code Playgroud)
我有这个查询,它执行此操作:
SELECT bar,
MAX(CASE WHEN abc."row" = 1 THEN feh ELSE NULL END) AS "val1",
MAX(CASE WHEN abc."row" = 2 THEN feh ELSE NULL END) AS "val2",
MAX(CASE WHEN abc."row" = 3 THEN feh ELSE …Run Code Online (Sandbox Code Playgroud) 我试图crosstab在PostgreSQL中创建查询,以便它自动生成crosstab列而不是硬编码.我编写了一个函数,可以动态生成我的crosstab查询所需的列列表.我们的想法是crosstab使用动态sql 在查询中替换此函数的结果.
我知道如何在SQL Server中轻松完成这项工作,但我对PostgreSQL的了解有限,阻碍了我在这方面的进展.我正在考虑将生成动态列列表的函数结果存储到变量中,并使用它来动态构建sql查询.如果有人可以指导我这样做会很棒.
-- Table which has be pivoted
CREATE TABLE test_db
(
kernel_id int,
key int,
value int
);
INSERT INTO test_db VALUES
(1,1,99),
(1,2,78),
(2,1,66),
(3,1,44),
(3,2,55),
(3,3,89);
-- This function dynamically returns the list of columns for crosstab
CREATE FUNCTION test() RETURNS TEXT AS '
DECLARE
key_id int;
text_op TEXT = '' kernel_id int, '';
BEGIN
FOR key_id IN SELECT DISTINCT key FROM test_db ORDER BY key LOOP …Run Code Online (Sandbox Code Playgroud) 我试图通过两个set-returns函数得到一个"交叉连接",但在某些情况下我没有得到"交叉连接",请参阅示例
行为1:当设置的长度相同时,它会逐个匹配每个集合中的项目
postgres=# SELECT generate_series(1,3), generate_series(5,7) order by 1,2;
generate_series | generate_series
-----------------+-----------------
1 | 5
2 | 6
3 | 7
(3 rows)
行为2:当设置的长度不同时,它会"交叉连接"这些集合
postgres=# SELECT generate_series(1,2), generate_series(5,7) order by 1,2;
generate_series | generate_series
-----------------+-----------------
1 | 5
1 | 6
1 | 7
2 | 5
2 | 6
2 | 7
(6 rows)
我想我在这里不了解一些事情,有人可以解释一下这种行为吗?
编辑:另一个例子,比以前更奇怪
postgres=# SELECT generate_series(1,2) x, generate_series(1,4) y order by x,y; x | y ---+--- 1 | 1 1 | 3 …
postgresql ×6
sql ×4
crosstab ×3
pivot ×2
case ×1
cross-join ×1
date ×1
dynamic-sql ×1
lateral-join ×1
plpgsql ×1
subquery ×1
time-series ×1