【问题标题】:Joining temp table whilst using row_number()在使用 row_number() 时加入临时表
【发布时间】:2021-05-07 21:12:57
【问题描述】:

我正在尝试在 Microsoft SQL Server 中获取下表。基本上,我要做的是为每个销售 ID 获取销售日期(日期和时间)和下一个销售日期(日期和时间),以及第一个销售日期的销售金额。下表应稍后解释。

我已经完成了以下编码,但还没有到达上表:

DECLARE @date1 AS datetime;
DECLARE @date2 AS datetime;

SET @date1 = DATEADD(HOUR, -72, GETDATE());
SET @date2 = DATEADD(HOUR, -1, GETDATE());

SELECT SaleID AS SaleID,
      ,[Sale Date & Time] AS SalesDate
      ,RN
INTO #sales
FROM (SELECT ROW_NUMBER() OVER (PARTITION BY SaleID ORDER BY [Sale Date & Time] ASC) AS RN,
             SaleID,
             SalesDate
      FROM Sales
      WHERE [Sale Date & Time] BETWEEN @date1 AND @date2) T;

查询第一部分的数据:

【问题讨论】:

  • amt 的值从何而来?样本数据将帮助我们帮助您。另外,我真的建议不要使用必须分隔标识的对象名称。 [Sale Date & Time] 确实不是一个好的列名选择。如果你想要一个包含多个单词的列,你最好使用 camelCase、PascalCase 或 Snake_case(就像你使用 SalesDate 一样)。
  • @Larnu - Amt 来自Sales 自己的表
  • 但它没有在您的子查询中定义,别名为T。我们看不到你的物体,所以你需要给出一个完整的例子。
  • 另外,您的子查询 (T) 没有定义列 [Sale Date & Time],因此由于列引用无效,上述内容会出错。
  • 不要把它放在 cmets 中,这没有任何意义。 Edit你的问题。

标签: sql-server join partitioning row-number


【解决方案1】:

我设法完成了上述部分,以防将来有人会发现它有用。

使用了以下编码

with cte as

( 

select rownum = ROW_NUMBER() over (partition by SalesID order by [Sales Date & Time] asc)
,SalesID,[Sale Date & Time],[Amount]
from Sales
where [Sales Date & Time] between GETDATE()-7 and GETDATE()
)

select 

    a.SalesID
    ,a.[Sale Date & Time] 
    ,b.Sale Date & Time] 
    ,a.[Amount]

from cte a

inner join cte b on b.rownum = a.rownum+1 and a.SalesID=b.SalesID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 2015-02-20
    • 2020-09-10
    • 2022-01-13
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多