我在下表中。
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
偏离了哪里。我在想像ROW_NUMBER
SELECT SupplierId, AuditId, QuestionId, Answer , ROW_NUMBER() OVER (PARTITION BY SupplierId, AuditId, QuestionId ORDER BY SupplierId) AS numOccurences
FROM Analytics2.Data.Question
ORDER BY SupplierId
OFFSET 0 ROWS
FETCH NEXT 100 ROWS ONLY;
答案 0 :(得分:0)
以下查询将为您提供所有具有多个D列不同值的供应商ID
SELECT SupplierId, count(distinct D)
AS numOccurences
FROM Analytics2.Data.Question
group by SupplierId having
count(distinct D) >1
ORDER BY SupplierId
答案 1 :(得分:0)
我认为您应该从Partition By子句中删除AuditID
:
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
答案 2 :(得分:0)
此查询将为您提供表中Answer
字段更改的行(和行号):
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
答案 3 :(得分:0)
您没有说您使用的SQL Server版本。 SQL Server 2012实现了LEAD
和LAG
函数。它们对于这种查询非常有效。
这里是使用方法的一种变体。调整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
;