首页 > 解决方案 > 根据条件分组

问题描述

我正在努力根据我的需要制作记录集。

TRXCODE 为 8202 的行包含记录集任何其他行的 10% TRAMT。

所以我想要一组 TRXCODE 8202 行和 10% 值在第 8202 行中的特定行。

下面我的图片会更好地解释你。

在此处输入图像描述

创建表#TempRecords(代码VARCHAR(20),TRDATE DATETIME,TRBATCH INT,TRREF VARCHAR(20),TRXCODE INT,TRAMT十进制(8,2)
);

GO
INSERT INTO #TempRecords
 VALUES ('ABMSC31', '2003-01-21', 6957, 'SD21010304', 1753, 31.20),
        ('ABMSC31', '2003-01-21', 6957, 'SD21010304', 8202, 3.12),
        ('ABMSC31', '2003-01-21', 6957, 'SD21010304', 8104, 589.68),
        ('ABMSC31', '2003-01-30', 7024, '0000056246', 8104, -31.20),
        ('ABMSC31', '2003-01-30', 7024, '0000056246', 1753, -589.68),
        ('ABMSC31', '2003-01-30', 7024, '0000056246', 8202, -3.12),
        ('ABMSC31', '2003-01-30', 7024, '0000056246', 8104, 554.60),
        ('ABMSC31', '2003-01-30', 7024, '0000056246', 1753, 32.18),
        ('ABMSC31', '2003-01-30', 7024, '0000056246', 8202, 3.22),
        ('ABMSC31', '2003-03-07', 7301, '0000057577', 1001, 1250.00),
        ('ABMSC31', '2003-03-07', 7301, '0000057577', 1001, 1250.00),
        ('ABMSC31', '2003-03-07', 7301, '0000057577', 1001, 1250.00),
        ('ABMSC31', '2003-09-25', 8737, '0000060259', 1701, 1104.00)

标签: sqlsql-server

解决方案


使用cross joindense_rank获取组 ID

with CTE as (
    select * from #TempRecords
    where trxcode = 8202
)
select T2.*,dense_rank () over (order by T1.TRAMT) GroupId 
from cte T1,(
    select * from #TempRecords
    where trxcode <> 8202   
) T2
where ROUND(T1.TRAMT/T2.TRAMT,1) = 0.1
union all
select *,dense_rank () over (order by TRAMT) GroupId from CTE

结果:

CODE                 TRTYPE               TRDATE                  TRBATCH     TRREF                TRXCODE     TRAMT                                   GroupId
-------------------- -------------------- ----------------------- ----------- -------------------- ----------- --------------------------------------- --------------------
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           1753        32.18                                   2
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8104        -31.20                                  1
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8202        -3.12                                   1
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8202        3.22                                    2

在线演示链接


请再做一件事,第 2 行和第 3 行也应该出现在 2 个单独的组中,所以根据上图总共应该有 4 个组。

with CTE as (
    select * from #TempRecords
    where trxcode = 8202
)
, CTE2 as (
    select * from #TempRecords
    where trxcode <> 8202   
)
, CTE3 as (
    select T2.*,dense_rank () over (order by T1.TRAMT) GroupId 
    from cte T1,CTE2 T2
    where ROUND(T1.TRAMT/T2.TRAMT,1) = 0.1
)
,CTE4 as (
    select *,dense_rank () over (order by TRAMT) GroupId from CTE
)
select * from CTE3
union all
select * from CTE4
union all
select *,dense_rank () over (order by TRAMT) + (select max(GroupId) from CTE4)  GroupId  
from CTE2 where TRAMT not in (select TRAMT from CTE3)  

结果:

CODE                 TRTYPE               TRDATE                  TRBATCH     TRREF                TRXCODE     TRAMT                                   GroupId
-------------------- -------------------- ----------------------- ----------- -------------------- ----------- --------------------------------------- --------------------
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8104        -31.20                                  1
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           1753        32.18                                   2
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8202        -3.12                                   1
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8202        3.22                                    2
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           1753        -589.68                                 3
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8104        554.60                                  4

演示链接


推荐阅读