我有一个表用户(它有数百万行)
Id Name Country Product
+----+---------------+---------------+--------------+
1 John Canada
2 Kate Argentina
3 Mark China
4 Max Canada
5 Sam Argentina
6 Stacy China
...
1000 Ken Canada
我想根据百分比用Product
,A
或B
填充C
列。
我有另一个名为CountriesStats的表,如下所示
Id Country A B C
+-----+---------------+--------------+-------------+----------+
1 Canada 60 20 20
2 Argentina 35 45 20
3 China 40 10 50
此表格包含每种产品的人员百分比。例如,在加拿大,60%的人拥有产品A,20%拥有产品B,20%拥有产品C.
我想根据第二个数据中的百分比向Users表填充数据。例如,如果加拿大有100万用户,我想在“用户”表格中填入Product
列的600000个A
200000 B
和200000 C
}
感谢您提供有关如何做到这一点的任何帮助。我不介意在多个步骤中执行它我需要提示如何在SQL中实现它
答案 0 :(得分:2)
这背后的逻辑并不太难。为每个国家/地区的每个人分配一个顺序计数器。然后,使用此值,根据此值分配正确的产品。例如,在您的示例中,当数字小于或等于600,000时,则会分配“A”。 600,001到800,000然后'B',最后'C'到其余部分。
以下SQL实现了这一点:
with toupdate as (
select u.*,
row_number() over (partition by country order by newid()) as seqnum,
count(*) over (partition by country) as tot
from users u
)
update u
set product = (case when seqnum <= tot * A / 100 then 'A'
when seqnum <= tot * (A + B) / 100 then 'B'
else 'C'
end)
from toupdate u join
CountriesStats cs
on u.country = cs.country;
with
语句定义了一个可更新的子查询,其中包含每行上每个国家/地区的序列号和总计。这是SQL Server的一个很好的功能,但并不是所有数据库都支持。
from
语句将加入CountriesStats
表,以获取每个国家/地区所需的值。 case
语句执行必要的逻辑。
请注意,序列号是使用newid()
随机分配的,因此应通过初始表随机分配产品。