我有一张类似的桌子
DateCol TaskID EventName
2017-09-25 10 A
2017-07-26 10 B
2017-07-27 10 A
2017-09-14 10 A
2017-07-25 10 B
2017-09-25 10 C
2017-09-28 11 A
2017-11-01 11 D
2017-11-01 11 C
.....数千行
我想要的是一个输出,对于每个TaskID,如果事件A和C(不是任何其他组合)在同一天(来自DateCol)发生,则EventName列为“ A + C”。所以在这种情况下,它将显示
DateCol TaskID EventName
2017-09-25 10 A+C
2017-07-26 10 B
2017-07-27 10 A
2017-09-14 10 A
2017-07-25 10 B
2017-09-28 11 A
2017-11-01 11 D
2017-11-01 11 C
您可以看到该行
2017-09-25 10 A
和
2017-09-25 10 C
现在是一行,
2017-09-25 10 A+C
但没有其他改变。
要进行这种调整,我需要做哪种SQL语句?
答案 0 :(得分:2)
假设:仅将2个不同的EventName合并为1。
有点粗糙,但应该可以。
; with
cte as
(
select t.DateCol, t.TaskID,
t.EventName,
new_EventName =
case when t.EventName in ('A')
and max(t.EventName) over (partition by t.DateCol, t.TaskID) = 'C'
then 'A+C'
when t.EventName in ('C')
and min(t.EventName) over (partition by t.DateCol, t.TaskID) = 'A'
then 'A+C'
else NULL
end
from yourtable t
)
select distinct DateCol, TaskID, EventName = coalesce(new_EventName, EventName)
from cte
如果还有其他情况不能解决问题,请发布带有预期结果的示例数据
答案 1 :(得分:0)
所以首先您需要为所有行添加一个主键/唯一列,然后我们找到在同一日期具有A和C的所有行。我们可以为此使用selfjoin。另外,我还假设TaskId
A和C之间的EventName
始终相同。
例如,如果表名是TableX
而主键列是PrimaryX
Select A.DateCol, A.TaskID, 'A+C' AS EventName FROM TableX A INNER JOIN TableX B
ON A.DateCol = B.DateCol AND (EventName ='A' OR EventName ='C')
然后,我们与普通查询合并,但普通查询不会从上一个查询中获取相同的数据。为此,我们可以在列PrimaryX
Select DateCol, TaskID, 'A+C' AS EventName FROM TableX A WHERE PrimaryX not in
(Select A.PrimaryX AS EventName FROM TableX A INNER JOIN TableX B
ON A.DateCol = B.DateCol AND (EventName ='A' OR EventName ='C')) AND PrimaryX not in
(Select B.PrimaryX AS EventName FROM TableX A INNER JOIN TableX B
ON A.DateCol = B.DateCol AND (EventName ='A' OR EventName ='C'))
UNION
Select A.DateCol, A.TaskID, 'A+C' AS EventName FROM TableX A INNER JOIN TableX B
ON A.DateCol = B.DateCol AND (EventName ='A' OR EventName ='C')
答案 2 :(得分:0)