0

通过将下面的 TeamRecords = 1 更改为 = 另一个数字,可以找到我更改为数量的行,只是有时它计数太多,这是奇怪的。创建新事件时,它有一个唯一编号,每次从任务表添加新分配时,它都会添加另一行 IncidentNumber,因此您可能有重复的事件编号行,我已使用下面的 seq = 1 删除了这些行. 创建新分配时,它会在任务表中创建一个新的 CreateddateTime,例如,您可以执行 Max(t.[CreatedDateTime] 来查找任何 IncidentNumber 的最后分配。因此,我需要找到 TeamRecords = 1该特定团队的所有记录,其中该团队只有一项任务。

这有帮助吗?这是我到目前为止...

Use TEST
Go

  WITH RankResult AS
(   
SELECT  i.[IncidentNumber],
        i.[CreatedDateTime],
        i.[ResolutionDateAndTime],
        i.[Priority],
        i.[Status],
        i.[ClientName],
        i.[ClientSite],
        t.[OwnerTeam],
        t.[Owner],
            row_number() over( partition by i.RecID 
                        order by t.CreatedDateTime desc, t.OwnerTeam ) seq,
        TeamRecords = COUNT(*) OVER(PARTITION BY t.ParentLink_RecID)
FROM    Incident as i
        Inner JOIN Task as t
            ON i.RecID = t.ParentLink_RecID
WHERE   t.OwnerTeam = 'Infrastructure Services'
AND     i.CreatedDateTime >= '20121001'
AND     i.CreatedDateTime <= '20131001'

)
SELECT  DISTINCT
    [IncidentNumber],
    [CreatedDateTime],
    [ResolutionDateAndTime],
    [Priority],
    [Status],
    [ClientName],
    [ClientSite],
    [OwnerTeam],
    [Owner]
FROM    RankResult
Where   TeamRecords = 1
And Seq = 1
Order By IncidentNumber Asc
GO
4

2 回答 2

0

您始终可以使用一个简单的子查询,它对相关列进行分组,对它们进行计数,过滤计数为 1 的位置,然后将其连接回主表以选择适当的行:

SELECT      Incident.*
FROM        (
                SELECT      OwnerTeam
                FROM        Incident AS Inc1
                GROUP BY    OwnerTeam
                HAVING      COUNT( * ) = 1
            )   AS Team 
        ,   Incident
WHERE       Incident.OwnerTeam = Team.OwnerTeam

(不过,如果没有更多信息,很难说这是否适合你。)

于 2013-10-21T14:00:42.310 回答
0

使用 ROW_NUMBER 意味着您将返回每个团队的第一个任务,不一定是只有一个任务的团队。为此,您可以使用COUNT(*) OVER()

WITH RankResult AS
(   
    SELECT  i.[IncidentNumber],
            i.[CreatedDateTime],
            i.[ResolutionDateAndTime],
            i.[Priority],
            i.[Status],
            i.[ClientName],
            i.[ClientSite],
            t.[OwnerTeam],
            t.[Owner],
            TeamRecords = COUNT(*) OVER(PARTITION BY i.RecID)
    FROM    Incident as i
            INNER JOIN Task as t
                ON i.RecID = t.ParentLink_RecID
    WHERE   t.OwnerTeam = 'Info Services'
    AND     i.CreatedDateTime >= '20121001'
    AND     i.CreatedDateTime <= '20131001'

)
SELECT  DISTINCT
        [IncidentNumber],
        [CreatedDateTime],
        [ResolutionDateAndTime],
        [Priority],
        [Status],
        [ClientName],
        [ClientSite],
        [OwnerTeam],
        [Owner]
FROM    RankResult
WHERE   TeamRecords = 1;

需要注意的 2 件事是我除了解析函数之外还进行了更改。首先,我已将您的日期更改为与文化无关的格式yyyyMMddyyyy-MM-dd但仍可能不明确,因此2013-01-02可能是 2 月 1 日或 1 月 2 日,具体取决于您的服务器/会话设置。其次,您的 where cluase 无论如何都将您的加入变成了一个INNER JOIN,所以我只是把它变成了一个INNER JOIN

    FROM    Incident as i
            LEFT JOIN Task as t
                ON i.RecID = t.ParentLink_RecID
    WHERE   t.OwnerTeam = 'Info Services'
    AND     i.CreatedDateTime >= '20121001'

在这里,如果没有匹配,Task那么OwnerTeam将是NULL并且NULL = 'Info Services'评估为假,因此您将永远不会返回任何不匹配的行,Task从而使其成为 INNER JOIN)。如果您确实想要一个 LEFT JOIN,那么您需要将此子句移动到 JOIN:

    FROM    Incident as i
            LEFT JOIN Task as t
                ON i.RecID = t.ParentLink_RecID
                AND t.OwnerTeam = 'Info Services'
    WHERE   i.CreatedDateTime >= '20121001'
于 2013-10-21T14:12:39.063 回答