基于SQL查询中的列项获取唯一行

基于SQL查询中的列项获取唯一行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个sql查询来返回IT票证和他们的满意度分数,但是由于我们票务系统的工作方式,有时会返回两行票证参考-1行为“未评级”,1行为真实评级 我的问题是,有没有一种方法可以让查询只为每个票证引用返回一行,并且只在不存在其他评分时返回“未评分”评分。i、 e.当有两行具有相同票证参考,其中一行评级为“优秀”,另一行评级为“未评级”时,它只返回评级为“优秀”的行。任何只有一行的“未评级”都应返回 到目前为止,查询看起来是这样的- SELECT DISTINCT t.Rating_Date,

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

我的问题是,有没有一种方法可以让查询只为每个票证引用返回一行,并且只在不存在其他评分时返回“未评分”评分。i、 e.当有两行具有相同票证参考,其中一行评级为“优秀”,另一行评级为“未评级”时,它只返回评级为“优秀”的行。任何只有一行的“未评级”都应返回

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

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
选择DISTINCT
t、 评级日期,
t、 id为“票证参考”,
[评级]
=案例
当tt.[rating_id]=20时,则为“差”
当tt.[rating_id]=15时,则为“平均值”
当tt.[rating_id]=17时,则“良好”
当tt.[rating_id]=6时,则为“优秀”
否则“未评级”
完,,
[主题],
[优先权],
[现状],
uu.name,
[受让人身份证],
[地点],
[技术]
从…起
[DB1].[dbo].[table1]t
内部联接[DB1].[dbo].[table2]tt
ON t.id=tt.ticket\U id
左联接[DB1].[dbo].[table3]uu
在t.u id=uu.id上
哪里
t、 评级日期>'2013-07-01'
和状态='已关闭'
地点=‘英国’
和“未知”技术
组id='5678912'
订购人
t-U日期

我认为您可以包装第一个查询,按
评级id
排序(如果未评级值为0,则应排序
DESC
,如果未评级为最高,则应排序
ASC
),然后使用sql server的功能选择第一条记录。

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

假设我们有以下数据:

注意:我使用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语句使用函数为给定票证的每组记录创建唯一的ID。我们正在使用DESC指令对记录进行排序,以确保“0”/“未评级”记录的ID更大

上一条语句的输出为:

从上面的屏幕截图可以看出,我们只需要显示行数等于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

“未评级”的tt.[rating_id]是什么?标记您的评论,“查询以仅返回每个票证参考的一行,如果不存在其他评级,则仅返回“未评级”评级”,但在您的表中,多行具有其他评级(即除“NotRated”评级外)是真的吗存在相同的票证引用。我认为最多可以有两行:一行标记为未评级,最后第二行标记为实际值rate@trippino没有评级ID,因为在另一个表中它只是空的,我需要它不是空的,因此是“未评级”条目。好的,所以如果您使用我的解决方案,您应该按描述订购