重复的行,不同的PK

时间:2012-11-20 14:35:41

标签: 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 
                           FROM someTable 
                           WHERE Transition_ID = @someValue) 
AND piv.PID = @someValue

我明白了:

enter image description here
我的问题是这些行是重复的,我希望它们在这一点上使用。 是否可以只在DISTINCT TSV上获取行?或类似的东西?

谢谢

2 个答案:

答案 0 :(得分:2)

你可以这样做:

;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;

请注意:如果您想要最高,则会返回每个不同pih.PID的最低piv.TSV,而只需使用ORDER BY pih.PID DESC

这是如何运作的:

排名函数ROW_NUMBER() OVER()将为PARTITION BY中列出的具有相同列的每个组提供排名编号,在我们的案例piv.TSV中,此排名编号将被订购,根据{{​​1}}子句中定义的ORDER BY子句,在我们的案例OVER中,每个组。我使用CTE而不是使用子查询。

然后我使用ORDER BY pih.PID,因为排名编号WHERE rownum = 1是针对具有相同rownum后代顺序的每组记录,然后是{{1将是具有最小piv.TSV的记录(想一想)。

但是,您可以使用rownum = 1的内部联接获得相同的结果,如下所示:

pih.PID

答案 1 :(得分:0)

你想要

吗?
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