我要完成的是Group
列。
如果一个任务有多个用户在工作,那么我想将其标记为Team
,其他标签为individual
。
Task Sub-Task User Group
1234 9999 A Team
1234 9998 B Team
1234 9997 C Team
2345 6666 A Team
2345 6665 B Team
3456 5555 A Individual A
4567 4444 B Individual B
5678 3333 C Individual C
答案 0 :(得分:1)
您可以使用窗口功能OVER()
。当COUNT()
大于1 Team
时,其他Individual
select *,
case when count(User) over (partition by Task) > 1
then 'Team'
else 'Individual'
end
from yourtable
答案 1 :(得分:0)
另一种选择是设置派生表(以CTE或内联方式),该表计算每个任务的用户数。然后,您可以使用它来显示所需的组(与@Squirrel的答案非常相似,只是将窗口函数替换为派生的记录集)。
WITH
TasksGroupedByUser(Task, UserCount) AS
(
SELECT Task, COUNT(DISTINCT [User])
FROM Tasks
GROUP BY Task
)
SELECT
Tasks.*,
CASE
WHEN TasksGroupedByUser.UserCount > 1 THEN 'Group'
ELSE 'Individual' + ' ' + Tasks.[User]
END
FROM Tasks
INNER JOIN TasksGroupedByUser ON
TasksGroupedByUser.Task = Tasks.Task
答案 2 :(得分:0)
这是您想要的吗?
SELECT Task, SubTask, [User], [Group] = CASE WHEN GroupCount > 1 THEN 'Group' ELSE 'Individual' END
FROM (
SELECT *, [GroupCount] = (SELECT COUNT(*) FROM TestTable AS B WHERE B.Task = A.Task)
FROM TestTable AS A) AS C
答案 3 :(得分:0)
我的2美分:
CREATE TABLE #tmp
(
[Id] BIGINT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
[Task] INT,
[SubTask] INT,
[User] NCHAR(1),
[Group] NVARCHAR(32)
)
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (1234, 9999, 'A', 'Team');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (1234, 9998, 'B', 'Team');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (1234, 9997, 'C', 'Team');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (2345, 6666, 'A', 'Team');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (2345, 6665, 'B', 'Team');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (3456, 5555, 'A', 'Individual A');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (4567, 4444, 'B', 'Individual B');
INSERT INTO #tmp ([Task], [SubTask], [User], [Group]) VALUES (5678, 3333, 'C', 'Individual C');
SELECT [A].[Task],
[B].[SubTask],
[B].[User],
CASE [A].[Cnt]
WHEN 1 THEN 'Individual ' + [User]
ELSE 'Team'
END AS [GroupCalculated],
[Group],
[A].[Cnt]
FROM ( SELECT [Task],
COUNT(*) AS [Cnt]
FROM #tmp
GROUP BY [Task]) AS [A]
INNER JOIN #Tmp AS [B]
ON [B].[Task] = [A].[Task];
DROP TABLE #tmp;
答案 4 :(得分:0)
窗口函数是处理此问题的好方法。使用const FormToolbar = () => (
<CardActions style={{display: 'none'}}>
</CardActions>
);
const FormDiv = ({controllerProps, ...props}) => (
<Grid container spacing={24}>
<Grid item xs={12}>
<SimpleForm toolbar={<FormToolbar/>}>
<TextField {...props} record={controllerProps.record} source="name"/>
</SimpleForm>
</Grid>
</Grid>
);
const OrderShow = props => (
<ShowController {...props} title="Order">
{controllerProps =>
<Show actions={<ShowActions pageType="show" />} {...props} {...controllerProps}>
<SimpleShowLayout>
<FormDiv controllerProps={controllerProps} />
</SimpleShowLayout>
</Show>
}
</ShowController>
);
export default OrderShow;
窗口功能的棘手部分是它不允许您执行COUNT
。因此,如果用户有2个子任务,当我猜您希望它返回1时,它将返回2。
但是,我们可以使用COUNT(DISTINCT ...)
和MIN
窗口函数来查看任务是否只有一个用户。
MAX
将在结果集中获得每个任务的“最小”用户值。同样,MIN([user]) OVER (PARTITION BY task)
将获得“最大值”。如果它们相同,则意味着该任务只有一个用户,即使同一用户有多个子任务。
MAX
没有窗口功能,这也是一种合适的方法,它与其他答案类似,但是我认为我会在此处包括它,并指出它仅包含不同的用户。
SELECT
task,
subtask,
[user],
CASE
WHEN MIN([user]) OVER (PARTITION BY task) = MAX([user]) OVER (PARTITION BY task)
THEN 'Individual ' + [user]
ELSE 'Team'
END
FROM Tasks
由于您打算在相当大的表上运行此程序,因此也许测试两个解决方案的性能可能会有所帮助。