我正在尝试根据比率更新 sql 表中的行。比例在不同的表中设置(例如1:1、2:1、3:1、1:2、1:3、2:3)
该表由关键数字和状态组成(0 = 运行,3 = 不运行)
首次填充表时,所有状态列均 = 0
表中的每个项目都将在比率的任一侧运行,但绝不会在两侧运行。
显示了 3:1 的比例,但 1:1 和 9:9 之间的任何迭代都是可能的。所需数据输出 1 始终基于左侧数字,所需数据输出始终基于右侧数字。表本身每天都会填充,行数每天都会变化,通常在 800 到 1200 个键之间。
Google 和 Stack Exchange 展示了 1,000 种不同的 SQL 计算比率的方法,但我找不到任何关于如何实现它们的信息。有什么想法吗?
我尝试了 WHILE 循环的各种排列,结果好坏参半。只要总行数可以除以比率中的两个数字以及两个数字的总和,我就得到了我需要的结果。但在大多数其他情况下,所需数据输出 1 组很好,但所需数据输出 2 组因除法的剩余部分而出现偏差。
正如前面评论中提到的,您可以使用模运算符来评估
DataOut 1
或 2
所需的条件。
下面的查询使用
generate_series()
来模拟表格的 Key
和 Status
显示为列 Status1
(数据输出 1)和 Status2
(数据输出 2)。
如果你的
Key
不连续,你将需要使用row_number()
来生成连续的流水数
-- ratio x:y 3:1
declare @x int = 3, @y int = 1;
declare @z int = @x + @y;
select [Key] = value,
Status1 = case when n.n < @x then 0 else 3 end,
Status2 = case when n.n < @x then 3 else 0 end
from generate_series(1,10,1) s
cross apply
(
select n = (s.value - 1) % @z
) n
结果:
钥匙 | 状态1 | 状态2 |
---|---|---|
1 | 0 | 3 |
2 | 0 | 3 |
3 | 0 | 3 |
4 | 3 | 0 |
5 | 0 | 3 |
6 | 0 | 3 |
7 | 0 | 3 |
8 | 3 | 0 |
9 | 0 | 3 |
10 | 0 | 3 |