我有以下查询:
Select PH.SubId
From dbo.PanelHistory PH
Where
PH.Scribe2Time <> (Select FIRST_VALUE(ReadTimeLocal) OVER (Order By ReadTimeLocal) From dbo.PanelWorkflow Where ProcessNumber = 2690 And dbo.PanelWorkflow.SubId = PH.SubId)
我收到错误消息(512):Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
子查询如何返回多个值?只能有一个第一个值。我必须忽略这个问题。
顺便说一下,我意识到我可以轻松地使用Min()而不是First_Value,但我想尝试一些这些Windowing函数。
答案 0 :(得分:2)
你看到多少行?
SELECT FIRST_VALUE(name) OVER (ORDER BY create_date) AS RN
FROM sys.objects
即使只有一个不同的第一个值,它仍会为查询中的每一行返回它。
因此,如果子查询本身匹配多行,您将收到此错误。您可以通过DISTINCT
或TOP 1
摆脱它。
可能效率不高,但你说这只是为了实验目的。
答案 1 :(得分:0)
这不是答案。这只是由以下结论产生的扩展评论:
无法使用我可以轻松地使用Min()而不是First_Value,但是我 想要试验一些这些窗口函数。
Min
代替FIRST_VALUE
。
示例:
SET NOCOUNT ON;
DECLARE @MyTable TABLE(ID INT, TranDate DATETIME)
INSERT @MyTable VALUES (1, '2012-02-02'), (2, '2011-01-01'), (3, '2013-03-03')
SELECT MIN(ID) AS MIN_ID FROM @MyTable
SELECT ID, MIN(ID) OVER(ORDER BY TranDate) AS MIN_ID_ORDER_BY FROM @MyTable;
SELECT ID, FIRST_VALUE(ID) OVER(ORDER BY TranDate) AS FIRST_VALUE_ID_ORDER_BY FROM @MyTable;
结果:
MIN_ID
-----------
1
ID MIN_ID_ORDER_BY
----------- ---------------
2 2
1 1
3 1
ID FIRST_VALUE_ID_ORDER_BY
----------- -----------------------
2 2
1 2
3 2
答案 2 :(得分:0)
FIRST_VALUE()
子句的每条记录, WHERE
仍会返回一行。 TOP 1
应该有效:
Select PH.SubId
From dbo.PanelHistory PH
Where
PH.Scribe2Time <> (Select TOP 1 ReadTimeLocal
From dbo.PanelWorkflow
Where ProcessNumber = 2690
And dbo.PanelWorkflow.SubId = PH.SubId
Order By ReadTimeLocal DESC)
或MIN:
Select PH.SubId
From dbo.PanelHistory PH
Where
PH.Scribe2Time <> (Select MIN(ReadTimeLocal)
From dbo.PanelWorkflow
Where ProcessNumber = 2690
And dbo.PanelWorkflow.SubId = PH.SubId)
答案 3 :(得分:0)
PARTITION/OVER
函数是预读列函数。它们不是行函数 - 我的意思是,它们不影响整行,返回的行数等。OVER
聚合可以依赖于其他行中的值,但有形结果只是计算当前行中的单个列。
您可能已经通过OVER ROW_NUMBER
排名功能看到了类似于您尝试做的事情。仍会返回多行,但只有其中一行的ROW_NUMBER
为1
。其余部分以封装WHERE
或JOIN
谓词进行过滤。