2017-10-10 196 views
0

我有相当的Query要写。 我有一个名为FG500的文件,它有一个名为UTXT(认证编号)的字段。该文件的关键字(不唯一)是型号(MODL)。该文件可以有多个行和型号。它还创建日期(CRDT),创建时间(CRTM),更改日期(CHDT),更改时间(CHTM)Where语句中的case语句

我需要根据创建日期&时间/变更日期拉动欧盟最新认证编号(UTXT) &时间。也就是说,如果更改日期/时间不是0,则拉取最新的数据。否则,请检查创建日期并从中提取最新记录。我将不得不使用一个案例,但不知道如何。任何帮助,高度赞赏。 样本数据:

Model Number L12G4AGAEA L12G4AGAEA 
UTXT   (Blank)  E4*2002/24*0458 
Create date  07/30/12  03/16/12 
Create Time  08:32:22  08:32:22 
Change Date  07/31/12  03/17/12 
Change Time  08:32:22  08:32:22 

预期的结果将是一个空白的最高更改日期/时间是第一个记录。如果更改日期为空,那么我将继续创建日期/时间

+1

添加一些示例表格数据和预期结果 - 作为格式化文本,而不是图像。 – jarlh

+0

我们假设这是用于'db2'吗? ('sql'的不同之处在于dbms。)'rpgle'与这个问题有什么关系? –

+0

是的,这是用于DB2 .. –

回答

0

也许这会有所帮助。我从第一组表格数据构建表格,并且查询演示如何使用ROW_NUMBER()来获得每个型号的“最新”行。我从这个例子中使用了MS SQL Server,因为DB2的查询语法是相似的。

这可能不是一个完整的答案,因为我无权访问DB2,所以我无法演示如何组合真正应该完成的日期和时间列。

SQL Fiddle

的MS SQL Server 2014架构设置

CREATE TABLE Table1 
    ([ModelNumber] varchar(10), [UTXT] varchar(15), [CREATEdate] datetime, [CREATEtime] varchar(8), [CHANGEdate] datetime, [CHANGEtime] varchar(8)) 
; 

INSERT INTO Table1 
    ([ModelNumber], [UTXT], [CREATEdate], [CREATEtime], [CHANGEdate], [CHANGEtime]) 
VALUES 
    ('L12G4AGAEA', NULL, '2012-07-30 00:00:00', '08:32:22', '2012-07-31 00:00:00', '08:32:22'), 
    ('L12G4AGAEA', 'E4*2002/24*0458', '2012-03-16 00:00:00', '08:32:22', '2012-03-17 00:00:00', '08:32:22'), 
    ('L12G4AGAEA', 'E4*2002/24*0458', '2012-07-11 00:00:00', '08:32:22', '2012-07-12 00:00:00', '08:32:22'), 
    ('L12G4AGAEA', NULL, '2012-07-25 00:00:00', '08:32:22', '2012-07-26 00:00:00', '08:32:22'), 
    ('L12G4AGAEA', 'E4*2002/24*0458', '2012-07-11 00:00:00', '08:32:22', '2012-07-12 00:00:00', '08:32:22'), 
    ('L12G4AGAEA', 'E4*2002/24*0458', '2012-05-22 00:00:00', '08:32:22', '2012-05-23 00:00:00', '08:32:22'), 
    ('L12G4AGAEA', 'E4*2002/24*0458', '2012-08-03 00:00:00', '08:32:22', '2012-08-03 00:00:00', '08:32:22'), 
    ('L12G4AGAEA', 'E4*2002/24*0458', '2012-05-22 00:00:00', '08:32:22', '2012-05-23 00:00:00', '08:32:22'), 
    ('L12G4AGAEA', 'E4*2002/24*0458', '2012-05-15 00:00:00', '08:32:22', '2012-05-16 00:00:00', '08:32:22'), 
    ('L12G4AGAEA', 'E4*2002/24*0458', '2012-07-20 00:00:00', '08:32:22', '2012-07-21 00:00:00', '08:32:22'), 
    ('L12G4AGAEA', 'E4*2002/24*0458', '2012-05-11 00:00:00', '08:32:22', '2012-05-14 00:00:00', '08:32:22') 
; 

查询1

select 
    * 
from (
     select 
      * 
      , row_number() over(partition by ModelNumber 
          order by coalesce(CHANGEdate,CREATEdate) DESC) rn 
     from table1 
    ) d 
where rn = 1 

Results

| ModelNumber |   UTXT |   CREATEdate | CREATEtime |   CHANGEdate | CHANGEtime | rn | 
|-------------|-----------------|----------------------|------------|----------------------|------------|----| 
| L12G4AGAEA | E4*2002/24*0458 | 2012-08-03T00:00:00Z | 08:32:22 | 2012-08-03T00:00:00Z | 08:32:22 | 1 | 
+0

当呈现“样本数据”时,使用逐行布局(如您最初所做的那样),并从左边缩进每行4个空格。它会被视为一个表格(例如上面的表格)。 –

+0

非常感谢!这是我使用的最终查询:Select COALESCE((选择UTXT FROM FG500F,其中MODL = 'L12G4AGAEA'和UTxT <>''ORDER BY CHGDTE desc,CHGTIM desc, CRTDTE desc,CRTTIM desc只提取第一行),' ')从 sysibm/SYSDUMMY1 –