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行。你是想写信吗