SQL Server返回记录的出现次数不同

时间:2019-02-26 23:22:41

标签: 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           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;

4 个答案:

答案 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

Demo on dbfiddle

答案 3 :(得分:0)

您没有说您使用的SQL Server版本。 SQL Server 2012实现了LEADLAG函数。它们对于这种查询非常有效。

这里是使用方法的一种变体。调整PARTITION BYORDER 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
;