sql - 根据条件分组
问题描述
我正在努力根据我的需要制作记录集。
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)
解决方案
使用cross join
和dense_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
推荐阅读
- python - 查找 Contour opencv 时缺少部分轮廓(受白色背景、文档扫描仪影响)
- reactjs - react-select-search 不允许我选择多个值
- reactjs - React Native:如何防止在未挂载的组件上更新状态导致的内存泄漏。状态在收到api响应后更新?
- java - Java Sound API 如何避免回声?
- r - 如何在没有 install_version() 的情况下安装特定版本的 R 包同时安装依赖项?
- c# - 计算数组中的数字(运行长度解码)
- html - 如何在占位符后将光标定位在搜索字段中
- javascript - 一个文本出现两次 puppeteer
- java - 将属性中的值注入接口字段
- windows - 突然,NPM 脚本变量不再起作用