【问题标题】:Selecting nth row in Inner Join on Microsoft SQL Server 2012在 Microsoft SQL Server 2012 的内部联接中选择第 n 行
【发布时间】:2016-04-14 10:31:29
【问题描述】:

我的礼物表有多行与下面的内部连接语句中的条件相匹配。我想选择一个特定的行(例如第 3、第 5 或第 32 行)。我曾尝试使用 Row_Number(),但它是一个窗口函数,需要在选择部分内(据我所知),但这会引发错误,因为整个语句必须只返回一个值。

我也尝试过使用 top 然后选择 top 的底部值(例如顶部 5,然后选择最后一个值),但我无法让它工作。使用下面的语句,如何修改它以同时选择第 n 行?

update output 
set output.gift_date01 = (select gifts.gift_date
                          where
                             gifts.gift_date >= '2015-1-1 00:00:00' 
                             and gifts.gift_date  <= '2015-12-31')
from output
inner join gifts on output.donor_id = gifts.donor_id;

谢谢!

【问题讨论】:

  • 我希望您意识到output 是 SQL Server 中的关键字,您可能不应该这样命名您的表?
  • 我不明白你是如何在你的陈述中获得第三个(或第五个或其他)的。
  • 我可以发布我是如何尝试做到的,但目前它并没有尝试在第 n 天之前获得任何结果,因为没有一个可以保持工作。

标签: sql sql-server sql-server-2012 inner-join


【解决方案1】:

我认为如果这不是您想要做的事情,这会让您接近。

;WITH CTE_Gifts AS
(
    SELECT
        G.donor_id,
        G.gift_date,
        ROW_NUMBER() OVER (PARTITION BY donor_id ORDER BY gift_date) AS row_num
    FROM
        dbo.Gifts G
    WHERE
        G.gift_date BETWEEN @start_date AND @end_date
)
UPDATE O
FROM
    [Output] O   -- Should be renamed to not a reserved keyword
INNER JOIN CTE_Gifts C ON
    C.donor_id = O.donor_id AND
    C.row_num = @some_row_number

【讨论】:

  • 谢谢!这完美地工作。给任何可能使用此功能的人的注意事项:我必须在开头的 CTE_Gifts 之后添加“AS”。
  • 谢谢,我已更正我的答案以包含 AS 关键字。
猜你喜欢
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多