SQL Server-仅选择最新日期

SQL Server-仅选择最新日期,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,RDBMS=Microsoft SQL Server 我在一家制冷公司工作,我们想更好地跟踪每个库存地点购买的制冷剂瓶的成本。我试图创建一个SQL查询来提取这些信息,但遇到了一些问题。对于每个库存位置,我想显示该库存位置上一次购买制冷剂的成本。我想查看我们记录的该位置购买特定制冷剂的最新日期。我尝试过使用Max函数,但没有成功,而Row_Number函数也没有成功。任何帮助都将不胜感激 见下面的代码示例,我试图只显示每个库存位置购买R-22 30磅水罐的最新日期 select lctn

RDBMS=Microsoft SQL Server

我在一家制冷公司工作,我们想更好地跟踪每个库存地点购买的制冷剂瓶的成本。我试图创建一个SQL查询来提取这些信息,但遇到了一些问题。对于每个库存位置,我想显示该库存位置上一次购买制冷剂的成本。我想查看我们记录的该位置购买特定制冷剂的最新日期。我尝试过使用Max函数,但没有成功,而Row_Number函数也没有成功。任何帮助都将不胜感激

见下面的代码示例,我试图只显示每个库存位置购买R-22 30磅水罐的最新日期

select 
    lctn_id as Location,
    invntryitm_id as InventoryItemID,
    invntryitm_nme as InventoryItemName,
    prchseordrlst_dte_rqstd as DateRequested,
    prchseordrlst_unt_cst as UnitCost
from 
    invntryitm
join
    prchseordrlst on prchseordrlst.invntryitm_rn = invntryitm.invntryitm_rn
join 
    prchseordr on prchseordr.prchseordr_rn = prchseordrlst.prchseordr_rn
join
    lctn on lctn.lctn_rn = prchseordr.lctn_rn
where   
    invntryitm.invntryitm_nme ='REFRIGERANT R-22 30#'
    and lctn_obslte = 'N'
group by 
    lctn.lctn_id, invntryitm.invntryitm_id, invntryitm.invntryitm_nme, 
    prchseordrlst.prchseordrlst_unt_cst
order by 
    lctn_id

我认为分析/窗口功能可以满足您的需求:

with location_data as (
  select 
    lctn_id as Location,
    invntryitm_id as InventoryItemID,
    invntryitm_nme as InventoryItemName,
    prchseordrlst_dte_rqstd as DateRequested,
    prchseordrlst_unt_cst as UnitCost,
    max (prchseordrlst_dte_rqstd) over (partition by lctn_id) as max_date
  from
    invntryitm
    JOIN prchseordrlst on prchseordrlst.invntryitm_rn = invntryitm.invntryitm_rn
    JOIN prchseordr on prchseordr.prchseordr_rn = prchseordrlst.prchseordr_rn
    JOIN lctn on lctn.lctn_rn = prchseordr.lctn_rn
  where
    invntryitm.invntryitm_nme ='REFRIGERANT R-22 30#' and
    lctn_obslte = 'N'
)
select *
from location_data
where max_date = DateRequested
order by Location
请记住,如果有一个平局,两个地点id记录的日期相同,那么您将同时获得这两个记录。如果这是一个问题,那么您可能需要
行编号()
而不是
max()

然后你会

where rn = 1
第一排


我没有首先列出
row_number()
的原因是
max
是O(n),如果您的数据有日期和时间,它可能足以满足您的需要。

为什么您不能让row_number函数工作?你有错误吗?请发布您的尝试,以便我们可以调试它。老实说,我以前从未使用过行数函数,我不理解它。非常感谢您!这两种解决方案都非常有效。
where rn = 1