Sql 重复的行,不同的主键

Sql 重复的行,不同的主键,sql,sql-server,distinct,Sql,Sql Server,Distinct,我有一个疑问: SELECT pih.PID, piv.TSV, piv.Variable_ID, piv.Value_ID, piv.Manual_Value FROM Process_Instance_Value AS piv INNER JOIN Process_Instance_History AS pih ON piv.PID = pih.PID WHERE piv.Variable_ID IN ( SELECT Variable_ID

我有一个疑问:

SELECT pih.PID, piv.TSV, piv.Variable_ID, piv.Value_ID, piv.Manual_Value
FROM Process_Instance_Value AS piv
INNER JOIN Process_Instance_History AS pih ON piv.PID = pih.PID
WHERE piv.Variable_ID IN ( SELECT Variable_ID 
                           FROM someTable 
                           WHERE Transition_ID = @someValue) 
AND piv.PID = @someValue
我明白了:


我的问题是,这些行是重复的,我希望它们在这一点上使用。 是否可以只获取不同TSV上的行?或者类似的

谢谢

您可以这样做:

;WITH CTE
AS
(
    SELECT 
      pih.PID, 
      piv.TSV, 
      piv.Variable_ID, 
      piv.Value_ID, 
      piv.Manual_Value,
      ROW_NUMBER() OVER (PARTITION BY piv.TSV ORDER BY pih.PID) rownum
    FROM Process_Instance_Value AS piv
    INNER JOIN Process_Instance_History AS pih ON piv.PID = pih.PID
    WHERE piv.Variable_ID IN ( SELECT Variable_ID 
                               FROM someTable 
                               WHERE Transition_ID = @someValue) 
    AND piv.PID = @someValue
)
SELECT *
FROM CTE
WHERE rownum = 1;
注意:这将返回每个不同的
piv.TSV
的最小
pih.PID
如果您想要最大值,只需使用
ORDER BY pih.PID DESC

这是如何工作的:

排名函数将为每个组提供一个排名编号,每个组的
分区中列出了相同的列,在我们的例子中,
piv.TSV
,该排名编号将根据
OVER
子句中定义的
ORDER BY
子句为每个组排序,在我们的例子中,
按pih.PID排序
。我使用了一个而不是子查询

然后我使用了
,其中rownum=1
,因为对于具有相同的
piv.TSV
的每组记录都给出了排序编号
rownum
,所以
rownum=1
的记录将是具有最小
pih.PID
的记录(仔细想想)

但是,使用带有
groupby
的内部联接可以获得相同的结果,如下所示:

    SELECT 
      pih.PID, 
      piv.TSV, 
      piv.Variable_ID, 
      piv.Value_ID, 
      piv.Manual_Value
    FROM Process_Instance_Value AS piv
    INNER JOIN
    (
        SELECT
          TSV, MIN(PID) MinPID
        FROM Process_Instance_Value 
        GROUP BY TSV
    ) piv2 ON piv.PID = piv2.MinPID
    INNER JOIN Process_Instance_History AS pih ON piv.PID = pih.PID
    WHERE piv.Variable_ID IN ( SELECT Variable_ID 
                               FROM someTable 
                               WHERE Transition_ID = @someValue) 
    AND piv.PID = @someValue
你想要什么

SELECT pih.PID,  piv.Variable_ID, piv.Value_ID, piv.Manual_Value
FROM Process_Instance_Value AS piv
INNER JOIN Process_Instance_History AS pih ON piv.PID = pih.PID
WHERE piv.Variable_ID IN ( SELECT Variable_ID 
                           FROM someTable 
                           WHERE Transition_ID = @someValue) 
AND piv.PID = @someValue
group by
pih.PID,  piv.Variable_ID, piv.Value_ID, piv.Manual_Value

那么,您希望检索哪个pih.PID?where rownum=1不会确保您只得到一行吗?尽管有多少不同的piv.TSV?@Gerrat每个
TSV
一行,这就是
分区所做的。@hermann-抱歉,我添加了一个解释。请参阅我的最新答案。