繁体   English   中英

SQL:唯一部分最近日期的返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM