我有这个问题:
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
我明白了:
我的问题是这些行是重复的,我希望它们在这一点上使用。
是否可以只在DISTINCT TSV上获取行?或类似的东西?
谢谢
答案 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