Sql 如何将2 CTE查询缩短(替换)为1 CTE查询
我有这张桌子:Sql 如何将2 CTE查询缩短(替换)为1 CTE查询,sql,postgresql,Sql,Postgresql,我有这张桌子: ID platform_order_number ------------------------- 1 B2CQWE 2 B2CWER 3 B2BZXC 4 XCV 对于这种情况,我想为每一个不同的平台提取一些第2行 ID platform_order_number platform -------------------------------------- # B2CQWE
ID platform_order_number
-------------------------
1 B2CQWE
2 B2CWER
3 B2BZXC
4 XCV
对于这种情况,我想为每一个不同的平台提取一些第2行
ID platform_order_number platform
--------------------------------------
# B2CQWE B2C
# B2CWER B2C
# B2BZXC B2B
# B2BXCV B2B
# ABC C2C
# EDF C2C
我的成功代码:
with cte as
(
select id, platform_order_number,
case when platform_order_number LIKE 'B2C%' then 'B2C'
when platform_order_number LIKE 'B2B%' then 'C2C'
else 'C2C'
end as platform
from table
),
cte1 as
(
select *, ROW_NUMBER() over (partition by platform order by platform)
as count_row_by_platform from cte
)
select *
from cte1
where count_row_by_platform < 2
这有点复杂,所以我试着把它简化如下,但它不起作用
select id, platform_order_number, sub_table.row_count
from apollo.packages
LEFT JOIN LATERAL (ROW_NUMBER() over
(partition by platform_order_number order by
platform_order_number) as row_count
from apollo.packages ) as sub_table
where sub_table.row_count <= 2
因为,我需要在不同的列上添加许多不同的条件,所以我希望使我的查询保持简单,以便轻松地添加和更改条件
x86_64-pc-linux-gnu上的PostgreSQL 11.4 Debian 11.4-1.pgdg90+1,
由gcc Debian 6.3.0-18+deb9u1 6.3.0 20170516编译,64位
嗯。我想你想要:
select t.*
from (select t.id, t.platform_order_number, v.platform,
row_number() over (partition by v.platform order by t.platform_order_number) as seqnum
from table t cross apply lateral
(values (case when platform_order_number LIKE 'B2C%' then 'B2C'
when platform_order_number LIKE 'B2B%' then 'C2C'
else 'C2C'
end)
) v(platform)
) t;
通常,窗函数在横向连接中的行为可能不符合预期。它们只处理横向联接中处理的行,通常只处理一行,而不是跨越原始表。Hmmm。我想你想要:
select t.*
from (select t.id, t.platform_order_number, v.platform,
row_number() over (partition by v.platform order by t.platform_order_number) as seqnum
from table t cross apply lateral
(values (case when platform_order_number LIKE 'B2C%' then 'B2C'
when platform_order_number LIKE 'B2B%' then 'C2C'
else 'C2C'
end)
) v(platform)
) t;
通常,窗函数在横向连接中的行为可能不符合预期。它们只处理横向联接中处理的行,通常只处理一行,而不是跨越原始表。您能否将您遇到的问题分解为一个小而完整的示例,其中显示了源数据和预期输出请注意,count_row_by_platform<2将只提取每个平台的一行,而不是2行。你的意思是写你能不能把你遇到的问题分解成一个小而完整的例子,它显示了源数据和预期的输出注意:count_row_by_platform<2将只提取每个平台的一行,而不是2行。你是想写信吗