SQL Server返回不同出现次数的记录
我看下表SQL Server返回不同出现次数的记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我看下表 SupplierId AuditId QuestionId Answer 3 123 1 abc 3 456 1 abc 3 789 1 abc 我想看看在这张表的什么地方发生了下面的事情 SupplierId AuditId QuestionId Answer 3 123 1
SupplierId AuditId QuestionId Answer
3 123 1 abc
3 456 1 abc
3 789 1 abc
我想看看在这张表的什么地方发生了下面的事情
SupplierId AuditId QuestionId Answer
3 123 1 abc
3 456 1 abc
3 789 1 def
我想知道D列偏离了哪里。我在想一个窗口函数,比如行数
下面的查询将为您提供所有具有多个不同D列值的供应商id
SELECT SupplierId, count(distinct D)
AS numOccurences
FROM Analytics2.Data.Question
group by SupplierId having
count(distinct D) >1
ORDER BY SupplierId
我认为你应该从分区By条款中删除海选:
SELECT SupplierId,
AuditId,
QuestionId,
Answer ,
ROW_NUMBER() OVER (PARTITION BY SupplierId, QuestionId
ORDER BY SupplierId,QuestionId) AS numOccurences
FROM Analytics2.Data.Question
ORDER BY sipplierId
如果只需要跟踪更改,请使用通用表表达式:
WITH CTE_1 AS (
SELECT SupplierId,
AuditId,
QuestionId,
Answer ,
ROW_NUMBER() OVER (PARTITION BY SupplierId, QuestionId
ORDER BY SupplierId,QuestionId) AS numOccurences
FROM Analytics2.Data.Question
)SELECT * FROM CTE_1
WHERE numOccurences = 1
ORDER BY sipplierId
此查询将为您提供表中答案字段更改的行和行号:
WITH cte AS (
SELECT *,
ROW_NUMBER() OVER (ORDER BY SupplierId) AS row
FROM Question)
SELECT cte2.*
FROM cte cte1
JOIN cte cte2 ON cte2.row = cte1.row + 1 AND cte2.Answer != cte1.Answer
输出:
SupplierId AuditId QuestionId Answer row
3 789 1 def 3
您没有说明您使用的SQL Server的版本。SQL Server 2012实现了超前和滞后功能。对于这种查询,它们非常有效 下面是如何使用它们的一个变体。调整PARTITION BY和ORDER BY子句以符合您的要求,这在问题中并不清楚
WITH
CTE
AS
(
SELECT
SupplierId, AuditId, QuestionId, Answer
,LAG(Answer) OVER (PARTITION BY SupplierId ORDER BY AuditID) AS PrevAnswer
FROM Analytics2.Data.Question
ORDER BY SupplierId, AuditID
)
SELECT
SupplierId, AuditId, QuestionId, Answer
FROM CTE
WHERE
Answer <> PrevAnswer
;
这些答案中有一个解决了你的问题吗?如果没有,你能提供更多的信息来帮助回答这个问题吗?否则,请考虑把答案最好的答案标在上下投票箭头上。看见
WITH
CTE
AS
(
SELECT
SupplierId, AuditId, QuestionId, Answer
,LAG(Answer) OVER (PARTITION BY SupplierId ORDER BY AuditID) AS PrevAnswer
FROM Analytics2.Data.Question
ORDER BY SupplierId, AuditID
)
SELECT
SupplierId, AuditId, QuestionId, Answer
FROM CTE
WHERE
Answer <> PrevAnswer
;