SQL Server根据特定行号获取列

SQL Server根据特定行号获取列,sql,sql-server,Sql,Sql Server,我有一个要求,我需要选择过去一年的订单基于电子邮件帐单地址电子邮件地址。我需要显示订单号、发货名、发货姓氏、账单地址、电子邮件id和项目说明以及提交日期。相同的地址表用于将发货地址存储为1,并将账单地址发货地址存储为始终为0。shipping address中的电子邮件字段是可选的,如果两个地址都匹配,则只将帐单地址写入DB 地址: 我写了一个初始查询,如下所示: select addr.first_name, addr.last_name, addr.order_num, addr.

我有一个要求,我需要选择过去一年的订单基于电子邮件帐单地址电子邮件地址。我需要显示订单号、发货名、发货姓氏、账单地址、电子邮件id和项目说明以及提交日期。相同的地址表用于将发货地址存储为1,并将账单地址发货地址存储为始终为0。shipping address中的电子邮件字段是可选的,如果两个地址都匹配,则只将帐单地址写入DB

地址:

我写了一个初始查询,如下所示:

select 
    addr.first_name, addr.last_name, addr.order_num, addr.Update_Date_Time,
    ord.Order_Amt, item.Item_Desc
from 
    ADDR addr 
inner join 
    ORDER ord on ord.Order_num = addr.Order_Num
inner join 
    ITEM item on ord.Order_num = item.Order_Num
where 
    addr.Order_Num in (select Order_num 
                       from TOEADDR addr 
                       where addr.ShipTo_Num = 0 
                         and addr.EM_EMAIL_ADDR = 'avc@abc.com'
                         and addr.Update_Date_Time > DATEADD(year,-1, GETDATE())) 
order by  
    addr.Update_Date_Time desc
是否有任何方法可以将此逻辑添加到上述查询中:

 (SELECT TOP 1 First_Name, LAST_NAME FROM ADDR ORDER BY ShipTo_Num ASC) 
谢谢,有了CTE,它就像一个符咒。以下是最终查询:

 ;with cte_addr
 AS
 (SELECT First_Name,LAST_NAME,  EM_EMAIL_ADDR, order_num,Update_Date_Time,ShipTo_Num
 , ROW_NUMBER() OVER (PARTITION BY order_num ORDER BY ShipTo_Num desc) as ROWID
 FROM ADDR 
 ) 
 SELECT addr.first_name , addr.last_name, addr.order_num, addr.Update_Date_Time,
 ord.Order_Amt, item.Item_Desc
 FROM cte_addr addr
  inner join ORDER ord on ord.Order_num = addr.Order_Num
 inner join ITEM item on ord.Order_num = item.Order_Num
   WHERE addr.ROWID =1  and 
 addr.Order_Num in(
  select Order_num from ADDR billAddress where
  billAddress.ShipTo_Num = 0 and billAddress.EM_EMAIL_ADDR = 'afv@abv.com'
  and billAddress.Update_Date_Time > DATEADD(year,-1,GETDATE()) 

 ) 
order by addr.Update_Date_Time desc

您可以使用CTE来实现它。您可以像下面这样编写查询。这可以是您正在寻找的逻辑的示例查询

;with cte_addr
 AS
 (SELECT First_Name,LAST_NAME, email EM_EMAIL_ADDR, order_num,Update_Date_Time,ShipTo_Num
 , ROW_NUMBER() OVER (PARTITION BY First_Name,LAST_NAME ORDER BY ShipTo_Num) ROWID
 FROM ADDR 
 ) 
 SELECT addr.first_name , addr.last_name, addr.order_num, addr.Update_Date_Time,
 ord.Order_Amt, item.Item_Desc
 FROM cte_addr addr
 inner join ORDER ord on ord.Order_num = addr.Order_Num
inner join ITEM item on ord.Order_num = item.Order_Num
 WHERE t.ROWID =1 
and addr.Order_Num in(
select Order_num from TOEADDR addr where
addr.ShipTo_Num = 0 and addr.EM_EMAIL_ADDR = 'avc@avc.com'
and addr.Update_Date_Time > DATEADD(year,-1,GETDATE()) 
 ) 
order by addr.Update_Date_Time desc

您能提供一些示例数据和预期结果吗?这真的有助于您尝试编写子查询和连接以实现预期结果吗?
;with cte_addr
 AS
 (SELECT First_Name,LAST_NAME, email EM_EMAIL_ADDR, order_num,Update_Date_Time,ShipTo_Num
 , ROW_NUMBER() OVER (PARTITION BY First_Name,LAST_NAME ORDER BY ShipTo_Num) ROWID
 FROM ADDR 
 ) 
 SELECT addr.first_name , addr.last_name, addr.order_num, addr.Update_Date_Time,
 ord.Order_Amt, item.Item_Desc
 FROM cte_addr addr
 inner join ORDER ord on ord.Order_num = addr.Order_Num
inner join ITEM item on ord.Order_num = item.Order_Num
 WHERE t.ROWID =1 
and addr.Order_Num in(
select Order_num from TOEADDR addr where
addr.ShipTo_Num = 0 and addr.EM_EMAIL_ADDR = 'avc@avc.com'
and addr.Update_Date_Time > DATEADD(year,-1,GETDATE()) 
 ) 
order by addr.Update_Date_Time desc