基于SQL查询中的列项获取唯一行
我有一个sql查询来返回IT票证和他们的满意度分数,但是由于我们票务系统的工作方式,有时会返回两行票证参考-1行为“未评级”,1行为真实评级 我的问题是,有没有一种方法可以让查询只为每个票证引用返回一行,并且只在不存在其他评分时返回“未评分”评分。i、 e.当有两行具有相同票证参考,其中一行评级为“优秀”,另一行评级为“未评级”时,它只返回评级为“优秀”的行。任何只有一行的“未评级”都应返回 到目前为止,查询看起来是这样的-基于SQL查询中的列项获取唯一行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个sql查询来返回IT票证和他们的满意度分数,但是由于我们票务系统的工作方式,有时会返回两行票证参考-1行为“未评级”,1行为真实评级 我的问题是,有没有一种方法可以让查询只为每个票证引用返回一行,并且只在不存在其他评分时返回“未评分”评分。i、 e.当有两行具有相同票证参考,其中一行评级为“优秀”,另一行评级为“未评级”时,它只返回评级为“优秀”的行。任何只有一行的“未评级”都应返回 到目前为止,查询看起来是这样的- SELECT DISTINCT t.Rating_Date,
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,因为在另一个表中它只是空的,我需要它不是空的,因此是“未评级”条目。好的,所以如果您使用我的解决方案,您应该按描述订购