首页 > 解决方案 > 从 MIN 日期获取 MAX 日期时间值

问题描述

我的表有零件号、零件序列号、零件测试号、零件测试结果和零件测试日期。关键是零件号、零件序列号、零件测试号和零件测试日期。同一序列号和测试号在同一天的不同日期和不同时间测试的零件。我想看看它被测试的第一天和那天的最后结果。我想创建一个视图。可以有不同的零件号,每个零件号可以有不同的序列号。每个零件编号与不同的测试编号相关联

以下是特定部件号、序列号、测试的结果

零件号 序列号 TEST # DATE 测试值
555-99 abcd123 10 11/30/18 2:02 0
555-99 abcd123 10 11/30/18 2:22 13714.66797
555-99 abcd123 10 11/30/18 2:23 2
555-99 abcd123 10 11/30/18 9:22 5
555-99 abcd123 10 11/30/18 10:22 14809.70703
555-99 abcd123 10 19 年 1 月 9 日 6:13 14574.62891
555-99 abcd123 10 19 年 1 月 9 日 6:14 14084.62891
555-99 abcd123 10 1/9/19 14:53 14119.66797
555-99 abcd123 10 19 年 1 月 9 日 14:54 13874.72656
555-99 abcd123 10 19 年 1 月 9 日 14:53 14844.74609
555-99 abcd123 10 1/11/19 7:19 15404.76563
555-99 abcd123 10 19 年 1 月 15 日 17:47 14179.76563
555-99 abcd123 10 1/17/19 0:17 14214.64844
555-99 abcd123 10 1/17/19 0:17 14216.64944

输出应该是

555-99  abcd123 10  11/30/18 9:22   5

我想创建一个视图,其中包含每个序列号的所有零件号及其最后一次测试时的测试号。

任何帮助是极大的赞赏。

如果我通过序列号,这将给出所需的结果:

 DECLARE @DATE DATETIME2(7);
   DECLARE @TOPDATE DATETIME2(7);
   DECLARE @MAXDATE DATETIME2(7);
    SELECT @Date = MIN(DATA_Date_Time) FROM DATA_Fields WHERE DATA_Serial = 
    'UNLDR598' ;
    SELECT @TOPDATE   = dateadd(hh,  23,  @DATE)
    select  @MAXDATE  =max(DATA_Date_Time )from DATA_Fields where  
    DATA_Date_Time    >   @DATE AND     DATA_Date_Time    <  @TOPDATE  AND 
    DATA_Serial = 'UNLDR598'  
     SELECT  DATA_PART,DATA_SERIAL, DATA_TEST,  data_value ,DATA_Date_Time 
     FROM DATA_Fields
  
       where DATA_Serial = 'UNLDR598' 
       AND   DATA_Date_Time = @MAXDATE 


 <br> 

标签: sqlsql-server

解决方案


您可以使用两个窗口函数来实现这一点。

declare @table table ([part number] varchar(6), [serial number] varchar(16),   [TEST #] int,  [DATE] datetime,  [test-value] decimal(10,5))
insert into @table
values
('555-99','abcd123',10,'11/30/18 2:02',0),
('555-99','abcd123',10,'11/30/18 2:22',13714.66797),
('555-99','abcd123',10,'11/30/18 2:23',2),
('555-99','abcd123',10,'11/30/18 9:22',5),
('555-99','abcd123',10,'11/30/18 10:22',14809.70703),
('555-99','abcd123',10,'1/9/19 6:13',14574.62891),
('555-99','abcd123',10,'1/9/19 6:14',14084.62891),
('555-99','abcd123',10,'1/9/19 14:53',14119.66797),
('555-99','abcd123',10,'1/9/19 14:54',13874.72656),
('555-99','abcd123',10,'1/9/19 14:53',14844.74609),
('555-99','abcd123',10,'1/11/19 7:19',15404.76563),
('555-99','abcd123',10,'1/15/19 17:47',14179.76563),
('555-99','abcd123',10,'1/17/19 0:17',14214.64844),
('555-99','abcd123',10,'1/17/19 0:17',14216.64944)

select top 1 with ties * 
from
(
    select 
        *
        ,FirstDay = dense_rank() over (partition by [part number], [serial number], [TEST #] order by cast([DATE] as date))
    from @table
) x
where FirstDay = 1
order by row_number() over (partition by [part number], [serial number], [TEST #] order by [DATE] desc) 

Thais 回答了我想在第一天看到它被测试的请求以及那天的最后一个结果,这与您的示例输出不匹配。

要获得预期输出的倒数第二个,请使用以下内容:

select * 
from(
    select 
        *
        ,RN = row_number() over (partition by [part number], [serial number], [TEST #] order by [DATE] desc)
    from
        (
        select 
            *
            ,FirstDay = dense_rank() over (partition by [part number], [serial number], [TEST #] order by cast([DATE] as date))
        from @table
        ) x
    where FirstDay = 1
) y
where RN = 2

推荐阅读