sql - 查询:如何根据条件枚举行?
问题描述
有下表:
DROP TABLE IF EXISTS #Data
CREATE TABLE #Data
(
Code VARCHAR(10),
Fee VARCHAR(3),
AValue DECIMAL(10, 4)
)
-- DELETE FROM #Data
INSERT INTO #Data
VALUES
('A001', '001', 100), ('A001', '002', 200), ('A001', '003', -50), ('A001', '004', -250), ('A001', '005', 340), ('A001', '006', 500), ('A001', '007', 600)
我需要得到以下结果(基于 Value 仍然是正数还是负数的有序序列):
Code Fee Value Row
A001 001 100.0000 P1
A001 002 200.0000 P1
A001 003 -50.0000 N1
A001 004 -250.0000 N1
A001 005 340.0000 P2
A001 006 500.0000 P2
A001 007 600.0000 P2
我试过这个:
SELECT Code, Fee, AValue, ROW_NUMBER() OVER(PARTITION BY Code, (CASE WHEN AValue > 0 THEN 1 ELSE 2 END) ORDER BY Fee) 'nRow',
FORMAT(ROW_NUMBER() OVER(PARTITION BY Code, Fee, CASE WHEN AValue > 0 THEN 1 ELSE 2 END ORDER BY Fee), CASE WHEN AValue > 0 THEN 'POS00' ELSE 'NEG00' END)
FROM #Data
但它返回:
Code Fee Value Row
A001 001 100.0000 P1
A001 002 200.0000 P1
A001 003 -50.0000 N1
A001 004 -250.0000 N1
A001 005 340.0000 P1
解决方案
这是一种差距和孤岛问题,但它很棘手。假设你没有0
价值观,那么sign()
就是你的朋友。
这是一种方法,当相邻行上的值应该组合时,行号的差异是恒定的:
SELECT Code, Fee, AValue,
DENSE_RANK() OVER (PARTITION BY sign(avalue) ORDER BY seqnum - seqnum_2) as num
FROM (SELECT d.*,
ROW_NUMBER() OVER (PARTITION BY code, sign(avalue) ORDER BY fee) as seqnum_2,
ROW_NUMBER() OVER (PARTITION BY code ORDER BY fee) as seqnum
FROM Data d
) d
ORDER BY Code, Fee;
您可以使用CONCAT()
或其他方式将其合并到您的字符串中。
这是一个 db<>fiddle。
推荐阅读
- django - 如何在一个模板中显示共享关系的两个表单?
- python - 使用列表理解的斐波那契数列
- typescript - 使用 NPM 包 UUID 生成 UUID?
- php - 已建立与数据库的连接但呈现空白页面
- uvm - UVM自动化宏的目的是什么?
- python-3.x - selenium python,尝试单击按钮
- java - 在 Android Studio 上工作的 CandidatesView 代码?
- ruby - 从导入的电子邮件中查找潜在 UTF-8 字符的最佳方法
- angular-material - Angular mat-sidenav 属性 isHandset$ | 异步解释
- javascript - 循环遍历音频元素的 JavaScript 数组