【问题标题】:Get a unique row based on a column item in SQL query根据 SQL 查询中的列项获取唯一行
【发布时间】:2013-09-13 06:58:18
【问题描述】:

我有一个 sql 查询来返回 IT 票及其满意度分数,但是由于我们的票务系统的工作方式,这有时会返回 2 行作为票证参考 - 1 行带有“未评级”评级,另一行具有真实评级。

我的问题是,有没有办法让查询只为每个票证参考返回一行,如果不存在另一个评级,则只返回“未评级”评级。即,当有 2 行具有相同的票证参考并且其中一个具有“优秀”评级和一个具有“未评级”评级时,它只返回具有“优秀”评级的行。应返回只有 1 行“未评级”的任何内容。

到目前为止,查询看起来像这样 -

SELECT DISTINCT
    t.Rating_Date,
    t.id AS 'Ticket Reference',
    [Rating]
            = CASE
            When tt.[rating_id] = 20 then 'Poor'
            When tt.[rating_id] = 15 then 'Average'
            When tt.[rating_id] = 17 then 'Good'
            When tt.[rating_id] = 6 then 'Excellent'
            else 'Not Rated'
            END,
    [subject],
    [priority],
    [status],
    uu.name,
    [assignee_id],
    [Location],
    [technology]

FROM 
    [DB1].[dbo].[table1] t

    INNER JOIN  [DB1].[dbo].[table2] tt 
                ON t.id=tt.ticket_id

    LEFT JOIN   [DB1].[dbo].[table3] uu 
                ON t.assignee_id=uu.id

WHERE 
    t.rating_date > '2013-07-01'
    AND status = 'closed'
    AND location = 'UK'
    AND technology <> 'Not Known'
    AND group_id = '5678912'

ORDER BY 
    t-rating_date

【问题讨论】:

  • “未评级”的 tt.[rating_id] 是什么?
  • 标记您的评论,“查询以仅返回每个票证参考的单行,如果不存在另一个评级,则仅返回“未评级”评级”但在您的表中是否存在多行与其他评级(即除“未评级”评级外)存在相同的票证。
  • 我认为可以有 2 行 MAX:一个标记为 Not rating,最终,第二个标记为实际速率
  • @trippino 没有评级 ID,因为在另一个表中它只是空白,我需要它不是空白,因此是“未评级”条目。
  • 好的,如果你使用我的解决方案,你应该通过 DESC 订购

标签: sql sql-server tsql


【解决方案1】:

我认为你可以包装第一个查询,按rating_id 排序(如果 Not rating 值为 0,你应该订购 DESC,如果 Not rating 是最高你应该订购ASC),然后使用sql-server的TOP函数选择第一条记录。

【讨论】:

    【解决方案2】:

    我想下面的逻辑可以在这里实现。请注意,我正在使用示例数据,为了实施解决方案,您应该了解这个想法。

    假设我们有以下数据:

    注意:我使用 ID“0”表示“未评级”状态。

    如果我正确理解了您的需求,输出数据应该是这样的:

    从上面的屏幕截图中可以看出,对于 ID 为 1 和 4 的工单,我们有“未评级”记录,但我们没有显示它们。只有 ID 为 3 的票证才会显示“未评级”状态。

    解决办法:

    ;WITH DataSource  AS
    (
        SELECT ROW_NUMBER() OVER (PARTITION BY [TicketID] ORDER BY [TicketRateID] DESC) AS [RowNumber]
              ,[TicketID]
              ,[TicketRateID]
        FROM @DataSource
    
    )
    SELECT [TicketID]
          ,[RowNumber]
          ,[TicketRateID]
    FROM DataSource
    

    上面的 SQL 语句使用ROW_NUMBER 函数来为给定票证的每组记录创建一个唯一 ID。我们正在使用 DESC 指令对记录进行排序,以确保“0”/“未评级”记录具有更大的 ID。

    上一条语句的输出是:

    从上面的截图可以看出,我们只需要显示 RowNumber 等于 1 的记录。这很简单,只需使用 WHERE 子句即可。

    如下,完整的工作示例:

    SET NOCOUNT ON
    GO
    
        DECLARE @DataSource TABLE
        (
             [TicketID] TINYINT
            ,[TicketRateID] TINYINT
        )
    
        INSERT INTO @DataSource ([TicketID],[TicketRateID])
        VALUES (1,6)
              ,(1,0)
              ,(2,20)
              ,(3,0)
              ,(4,0)
              ,(4,15)
    
    
        ;WITH DataSource  AS
        (
            SELECT ROW_NUMBER() OVER (PARTITION BY [TicketID] ORDER BY [TicketRateID] DESC) AS [RowNumber]
                  ,[TicketID]
                  ,[TicketRateID]
            FROM @DataSource
    
        )
        SELECT [TicketID]
              ,[RowNumber]
              ,[TicketRateID]
        FROM DataSource
        WHERE [RowNumber] = 1  
    
    SET NOCOUNT OFF
    GO
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2020-12-03
      • 1970-01-01
      • 2020-06-17
      相关资源
      最近更新 更多