在SQL中使用比例分割数据

问题描述 投票:0回答:1

我正在尝试根据比率更新 sql 表中的行。比例在不同的表中设置(例如1:1、2:1、3:1、1:2、1:3、2:3)

该表由关键数字和状态组成(0 = 运行,3 = 不运行)

首次填充表时,所有状态列均 = 0

表中的每个项目都将在比率的任一侧运行,但绝不会在两侧运行。

Example Tables

显示了 3:1 的比例,但 1:1 和 9:9 之间的任何迭代都是可能的。所需数据输出 1 始终基于左侧数字,所需数据输出始终基于右侧数字。表本身每天都会填充,行数每天都会变化,通常在 800 到 1200 个键之间。

Google 和 Stack Exchange 展示了 1,000 种不同的 SQL 计算比率的方法,但我找不到任何关于如何实现它们的信息。有什么想法吗?

我尝试了 WHILE 循环的各种排列,结果好坏参半。只要总行数可以除以比率中的两个数字以及两个数字的总和,我就得到了我需要的结果。但在大多数其他情况下,所需数据输出 1 组很好,但所需数据输出 2 组因除法的剩余部分而出现偏差。

stored-procedures sql-server-2019
1个回答
0
投票

正如前面评论中提到的,您可以使用模运算符来评估

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
© www.soinside.com 2019 - 2024. All rights reserved.