MySQL Server:检查组中是否存在条件,然后标记整个组
MySQLServer: Check if conditions exist in group, then label entire group
我的目标是向现有 table 添加另一列,以查看 value/conditions 是否存在于组中,并适当地标记整个组是否存在。
如果一个团队有一个预算 >= 20M 或 Actual_Spend >=2.5M 的项目,我想在类别列中将团队及其所有项目标记为 Table 1。无论同一团队中的其他项目是否符合此标准。
我会提供一个 SQL fiddle link 我的解决方案:http://sqlfiddle.com/#!18/3ddaf/12/0
我最终得到了 "Team" 和 "Category" 两个额外的列,但不确定它们是如何结束的。
以下是我正在寻找的最终结果。我愿意接受比我提供的更好的解决方案。
感谢您的宝贵时间
| Team | ProjectID | Budget | Actual_Spend | State | Category |
|------|-----------|----------|--------------|------------|----------|
| Cyan | 2 | NULL | NULL | Utah | Table 1 |
| Blue | 1 | NULL | 3000000 | California | Table 1 |
| Cyan | 1 | 20000000 | 1000000 | Utah | Table 1 |
| Blue | 2 | 22000000 | NULL | California | Table 1 |
| Red | 1 | 7000000 | 1000000 | Washington | Table 2 |
| Red | 2 | 19999000 | 2490000 | Oregon | Table 2 |
| Gray | 1 | 19000000 | 2500000 | Utah | Table 1 |
| Gray | 1 | 10000000 | 500000 | Utah | Table 1 |
提供创建数据集的代码:
Create Table Source_Data
(
Team varchar(50),
ProjectID INT,
BUDGET INT,
Actual_Spend INT,
State varchar(max),
)
INSERT INTO Source_Data
VALUES
('Blue',1,NULL,3000000,'California'),
('Green',1,20000000,1000000,'Utah'),
('Blue',2,22000000,NULL,'California'),
('Green',2,NULL,NULL,'Utah'),
('Red',1,7000000,1000000,'Washington'),
('Red',2,19999000,2490000,'Oregon'),
('Yellow',1,19000000,2500000,'Utah'),
('Yellow',1,10000000,500000,'Utah');
我认为您正在寻找 window 函数:
select
s.*,
min(case when Budget>=20000000 or Actual_Spend>=2500000 then 'Table1' else 'Table2' end)
over(partition by team) Category
from Source_Data s
如果任何具有相同团队的记录满足条件Budget>=20000000 or Actual_Spend>=2500000
,则新列产生Table1
,否则产生Table2
。
Team | ProjectID | Budget | Actual_Spend | State | Category
:--- | --------: | -------: | -----------: | :--------- | :-------
Blue | 2 | 22000000 | null | California | Table1
Blue | 1 | null | 3000000 | California | Table1
Cyan | 1 | 20000000 | 1000000 | Utah | Table1
Cyan | 2 | null | null | Utah | Table1
Gray | 1 | 19000000 | 2500000 | Utah | Table1
Gray | 1 | 10000000 | 500000 | Utah | Table1
Red | 1 | 7000000 | 1000000 | Washington | Table2
Red | 2 | 19999000 | 2490000 | Oregon | Table2
我的目标是向现有 table 添加另一列,以查看 value/conditions 是否存在于组中,并适当地标记整个组是否存在。
如果一个团队有一个预算 >= 20M 或 Actual_Spend >=2.5M 的项目,我想在类别列中将团队及其所有项目标记为 Table 1。无论同一团队中的其他项目是否符合此标准。
我会提供一个 SQL fiddle link 我的解决方案:http://sqlfiddle.com/#!18/3ddaf/12/0 我最终得到了 "Team" 和 "Category" 两个额外的列,但不确定它们是如何结束的。 以下是我正在寻找的最终结果。我愿意接受比我提供的更好的解决方案。
感谢您的宝贵时间
| Team | ProjectID | Budget | Actual_Spend | State | Category |
|------|-----------|----------|--------------|------------|----------|
| Cyan | 2 | NULL | NULL | Utah | Table 1 |
| Blue | 1 | NULL | 3000000 | California | Table 1 |
| Cyan | 1 | 20000000 | 1000000 | Utah | Table 1 |
| Blue | 2 | 22000000 | NULL | California | Table 1 |
| Red | 1 | 7000000 | 1000000 | Washington | Table 2 |
| Red | 2 | 19999000 | 2490000 | Oregon | Table 2 |
| Gray | 1 | 19000000 | 2500000 | Utah | Table 1 |
| Gray | 1 | 10000000 | 500000 | Utah | Table 1 |
提供创建数据集的代码:
Create Table Source_Data
(
Team varchar(50),
ProjectID INT,
BUDGET INT,
Actual_Spend INT,
State varchar(max),
)
INSERT INTO Source_Data
VALUES
('Blue',1,NULL,3000000,'California'),
('Green',1,20000000,1000000,'Utah'),
('Blue',2,22000000,NULL,'California'),
('Green',2,NULL,NULL,'Utah'),
('Red',1,7000000,1000000,'Washington'),
('Red',2,19999000,2490000,'Oregon'),
('Yellow',1,19000000,2500000,'Utah'),
('Yellow',1,10000000,500000,'Utah');
我认为您正在寻找 window 函数:
select
s.*,
min(case when Budget>=20000000 or Actual_Spend>=2500000 then 'Table1' else 'Table2' end)
over(partition by team) Category
from Source_Data s
如果任何具有相同团队的记录满足条件Budget>=20000000 or Actual_Spend>=2500000
,则新列产生Table1
,否则产生Table2
。
Team | ProjectID | Budget | Actual_Spend | State | Category :--- | --------: | -------: | -----------: | :--------- | :------- Blue | 2 | 22000000 | null | California | Table1 Blue | 1 | null | 3000000 | California | Table1 Cyan | 1 | 20000000 | 1000000 | Utah | Table1 Cyan | 2 | null | null | Utah | Table1 Gray | 1 | 19000000 | 2500000 | Utah | Table1 Gray | 1 | 10000000 | 500000 | Utah | Table1 Red | 1 | 7000000 | 1000000 | Washington | Table2 Red | 2 | 19999000 | 2490000 | Oregon | Table2