【问题标题】:How to index row number in SQL Server如何在 SQL Server 中索引行号
【发布时间】:2021-07-29 09:18:24
【问题描述】:

我有主表和事务表。

1 shipmentheader
2 shimentdetails

我已经加入(内连接)两个表,数据就像

装运头

headerid header
---------------
1        h1
2        h2

订单详情

detailid headerid details      createddate
------------------------------------------
1          1          d1
2          1          d2
3          2          d2

现在当我加入这两个时,我想根据Headerid (shipmentmaster) 生成行号。

加入数据后,排序应在详细信息表createddate 上。我没有低于行号,我想根据HeaderID order by shipping detail table created date 保持增加的数量, 如果存在三个标题 ID,那么它将保持行号 1,2,3 并保持相同的 1,1,2,2 相同,如果加入详细信息表。

RowNumber headerid header details     createddate
-------------------------------------------------
1             1       h1   d1          date
1             2       h1   d3          date
2             2       h2   d2           date

以下是我尝试过的查询,但它们不起作用,也尝试过rank()

select 
    row_number() over (partition by sh.ShipmentHeaderID order by sd.createddate) as 'RowNumber',
    sh.headerid, sh.header, sd.details, sd.createddate 
from 
    ShipmentHeader as sh 
inner join 
    ShipmentDetails as sd on sh.ShipmentHeaderID = sd.ShipmentHeaderID


select 
    dense_rank() over (partition by sh.ShipmentHeaderID order by sd.createddate) as 'RowNumber',
    sh.headerid, sh.header, sd.details, sd.createddate 
from 
    ShipmentHeader as sh 
inner join 
    ShipmentDetails as sd on sh.ShipmentHeaderID = sd.ShipmentHeaderID

为此,我使用 row_number、dense_rank、rank、partition by 加入了以下查询。但我无法得到我想要的结果。

我试图得到这样的输出:

 RowNumber headerid header details     createddate
 ------------------------------------------------------
    1             1       h1   d1          date
    1             2       h1   d3          date
    2             2       h2   d2           date

你能帮我解决这个问题吗?

【问题讨论】:

  • 应该是dense_rank() over (order by sh.ShipmentHeaderID)
  • @Squirrel,我可以,但有一个问题是我们需要根据最近的订单显示数据,按发货详细信息创建日期(交易详细信息)表...请您帮忙考虑一下。
  • 根据您的样本数据和预期结果,RowNumber 似乎与date 无关。也许您可以发布更多示例数据和预期结果来说明这一点

标签: sql sql-server sql-server-2008 window-functions


【解决方案1】:

如果您想按特定顺序查看数据,则需要在查询中使用order by。我认为这可能会满足您的要求:

select dense_rank() over (order by sh.ShipmentHeaderID) as RowNumber,
       sh.headerid, sh.header, sd.details, sd.createddate 
from ShipmentHeader sh inner join 
     ShipmentDetails sd 
     on sh.ShipmentHeaderID = sd.ShipmentHeaderID
order by max(sd.createddate) over (partition by sd.headerid) desc,
         sd.headerid;

我怀疑标题 ID 是按创建顺序排列的。但如果不是,则需要一个子查询:

select dense_rank() over (order by sh.min_createddate, sh.ShipmentHeaderID) as RowNumber,
       sh.headerid, sh.header, sd.details, sd.createddate 
from ShipmentHeader sh inner join 
     (select sd.*,
             min(sd.createddate) over (partition by sd.headerid) as min_createddate
      from ShipmentDetails sd 
     ) sd
     on sh.ShipmentHeaderID = sd.ShipmentHeaderID
order by sd.min_createddate desc, sd.headerid;

我不确定您是否希望增加或减少排序,或者您是否希望最小或最大创建日期,所以这可能需要调整。

【讨论】:

  • 这里我们已经创建了日期,需要考虑详细信息表。所以需要按详细信息表日期顺序列出订单。每页还保留 10 条记录,这应该是 ShipmentHeader 中的 Header 的行号......所以意味着,列出 10 条记录 par Header 的页面,其中从 ShpimentDetails 表中具有最新的修改日期描述,并且需要应用过滤器、排序和搜索详细信息列的详细信息表...我遇到了麻烦。
猜你喜欢
  • 2013-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多