[英]Microsoft SQL Server : return only the rows with the most recent date for each unique ID
[英]SQL: Return ID for the most recent date for unique part
我将如何修改以下查询以为每个唯一的Part_Number仅返回最新Quote_Date的Quote.Quote? 由于Quote是唯一的,因此我无法仅返回第一条记录。 我知道这已经以几乎相同的方式被问过很多次,但是,我无法使用row_number,rank,partition,派生表等完全正确地解决它。 谢谢你的帮助。
Sample
Quote Part_Number Quote_Date
1 a 1/1/12
2 a 1/2/12
3 a 1/3/12
4 b 1/2/12
5 b 1/3/12
6 c 1/1/12
Desired Results
Quote Part_Number Quote_Date
3 a 1/3/12
5 b 1/3/12
6 c 1/1/12
SELECT Quote.Quote, Quote.Part_Number, MAX(RFQ.Quote_Date) AS Most_Recent_Date
FROM Quote INNER JOIN RFQ ON Quote.RFQ = RFQ.RFQ
GROUP BY Quote.Part_Number, Quote.Quote
HAVING (NOT (Quote.Part_Number IS NULL))
该查询将最大日期编号为“ 1”,因为partition...order by quote_date desc
子句对partition...order by quote_date desc
进行了partition...order by quote_date desc
。
select Quote, Part_number, Quote_date,
rank() over (partition by part_number
order by quote_date desc) as date_order
from sample
在这种情况下,rank()函数通常比row_number()更好。 如果您碰巧有两行具有相同的零件号最大日期,则rank()会为它们编号相同。 要查看其工作原理,请insert into your_table values (7, 'a', '2012-01-03')
,然后使用rank()运行查询。 将其更改为row_number()。 看到不同?
从与WHERE子句选择。
select Quote, Part_number, Quote_date
from
(select Quote, Part_number, Quote_date,
rank() over (partition by part_number
order by quote_date desc) as date_order
from sample) t1
where date_order = 1;
另一种方法是首先导出零件号和与之相关联的最长日期。
select Part_Number, max(Quote_Date) as max_quote_date
from sample
group by Part_number;
然后将其连接到原始表以选择所需的其他任何列。
select s.Quote, s.Part_Number, s.Quote_Date
from sample s
inner join (select Part_Number, max(Quote_Date) max_quote_date
from sample
group by Part_number) t1
on s.Part_Number = t1.Part_number
and s.Quote_Date = t1.max_quote_date
order by Part_Number;
试一下。 我不确定是否需要Part_Number where子句,但是您将其包含在原始SQL中(作为HAVING子句),因此我保留了它。 我显然不确切知道您的数据看起来如何,但重要的是子选择的其余部分。
SELECT a.Quote, a.Part_Number, a.Quote_Date
FROM
(SELECT ROW_NUMBER() OVER(PARTITION BY q.Part_Number ORDER BY r.Quote_Date DESC) AS RowNum,
q.Quote, q.Part_Number, r.Quote_Date
FROM Quote q INNER JOIN RFQ r ON q.RFQ = r.RFQ
WHERE q.Part_Number IS NOT NULL) a
WHERE a.RowNum = 1;
CTE使它易于执行且易于阅读。
;with cte as (
select
*,
row_number() over (partition by Part_Number order by Quote_Date desc) rownum
from
@quote
)
select Quote, Part_Number, Quote_Date from cte where rownum = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.