Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server返回不同出现次数的记录_Sql_Sql Server_Tsql - Fatal编程技术网

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
;