T-SQL First_Value() - 如何返回多个值?

时间:2013-12-17 19:47:32

标签: sql-server tsql

我有以下查询:

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函数。

4 个答案:

答案 0 :(得分:2)

你看到多少行?

SELECT FIRST_VALUE(name) OVER (ORDER BY create_date) AS RN
FROM   sys.objects 

即使只有一个不同的第一个值,它仍会为查询中的每一行返回它。

因此,如果子查询本身匹配多行,您将收到此错误。您可以通过DISTINCTTOP 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)

对于符合tour 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_NUMBER1。其余部分以封装WHEREJOIN谓词进行过滤。