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-抱歉,我添加了一个解释。请参阅我的最新答案。