如果连续值不满足定义的条件,如何在查询中增加分组数?
How to increment grouping number in query if consecutive values don't satisfy conditions defined?
我会简单描述一下问题。
----------------------------------------------------------------------------------------------------
| Total UnitName UnitValue PartlyStatus PartlyValue CountMetric CountValue | RowNo
| |
| 79 A 7654 B 0 C 360 | 1
| 79 A 7656 B 0 C 360 | 2
| 79 A 7657 B 0 C 360 | 2
| 79 A 7658 B 0 C 360 | 2
| 79 A 7659 B 1 C 240 | 3
| 79 A 7660 B 0 C 360 | 4
| 79 A 7662 B 1 C 240 | 5
| 79 A 7663 B 1 C 240 | 5
| 79 A 7664 B 1 C 240 | 5
| 79 A 7665 B 1 C 240 | 5
| 79 A 7667 B 1 C 240 | 6
| 79 A 7668 B 1 C 240 | 6
| 79 A 7669 B 1 C 240 | 6
| 79 A 7670 B 0 C 360 | 7
| 79 A 7671 B 0 C 360 | 7
| 79 A 7672 B 0 C 360 | 7
---------------------------------------------------------------------------------------------------
如果不满足约束,我必须在 SQL Server Reporting Services(SSRS) 中的 table 中创建新行。
我必须应用的规则:
如果 UnitValue 数字不连续,则使用下一行。
如果 partlyValue 的二进制值发生变化,则使用下一行。
我必须编写一个创建 RowNo 的查询,如果不满足条件,它会递增。
我显示的table是从长查询中得出的结果,用于演示问题。 RowNo 列是为显示预期结果而编写的。
我的问题是为了理解和思考解决问题的优雅方法,
所以概念性的查询示例或解决方案对我来说很好,只要它能让我朝着正确的方向前进。
您需要在解决方案资源管理器中编写函数。
我认为您只需要 window 函数。遵循逻辑有点困难,但这可以满足您的需求:
select t.*,
sum(case when prev_uv = unitvalue - 1 and
prev_pv = partlyvalue
then 0 -- no new group
else 1
end) over (order by unitvalue) as rowno
from (select t.*,
lag(unitvalue) over (order by unitvalue) as prev_uv,
lag(partlyvalue) over (order by unitvalue) as prev_pv
from t
) t;
我会简单描述一下问题。
----------------------------------------------------------------------------------------------------
| Total UnitName UnitValue PartlyStatus PartlyValue CountMetric CountValue | RowNo
| |
| 79 A 7654 B 0 C 360 | 1
| 79 A 7656 B 0 C 360 | 2
| 79 A 7657 B 0 C 360 | 2
| 79 A 7658 B 0 C 360 | 2
| 79 A 7659 B 1 C 240 | 3
| 79 A 7660 B 0 C 360 | 4
| 79 A 7662 B 1 C 240 | 5
| 79 A 7663 B 1 C 240 | 5
| 79 A 7664 B 1 C 240 | 5
| 79 A 7665 B 1 C 240 | 5
| 79 A 7667 B 1 C 240 | 6
| 79 A 7668 B 1 C 240 | 6
| 79 A 7669 B 1 C 240 | 6
| 79 A 7670 B 0 C 360 | 7
| 79 A 7671 B 0 C 360 | 7
| 79 A 7672 B 0 C 360 | 7
---------------------------------------------------------------------------------------------------
如果不满足约束,我必须在 SQL Server Reporting Services(SSRS) 中的 table 中创建新行。
我必须应用的规则:
如果 UnitValue 数字不连续,则使用下一行。
如果 partlyValue 的二进制值发生变化,则使用下一行。
我必须编写一个创建 RowNo 的查询,如果不满足条件,它会递增。
我显示的table是从长查询中得出的结果,用于演示问题。 RowNo 列是为显示预期结果而编写的。
我的问题是为了理解和思考解决问题的优雅方法, 所以概念性的查询示例或解决方案对我来说很好,只要它能让我朝着正确的方向前进。
您需要在解决方案资源管理器中编写函数。
我认为您只需要 window 函数。遵循逻辑有点困难,但这可以满足您的需求:
select t.*,
sum(case when prev_uv = unitvalue - 1 and
prev_pv = partlyvalue
then 0 -- no new group
else 1
end) over (order by unitvalue) as rowno
from (select t.*,
lag(unitvalue) over (order by unitvalue) as prev_uv,
lag(partlyvalue) over (order by unitvalue) as prev_pv
from t
) t;