Where子句问题中的case语句

时间:2017-10-10 21:11:23

标签: sql ibm-midrange db2-400 rpgle

我有很多查询要写。 我有一个名为FG500的文件,其中有一个名为UTXT(证书编号)的字段。该文件的密钥(非唯一)是型号(MODL)。该文件可以有多个带有型号的行。它还创建日期(CRDT),创建时间(CRTM),更改日期(CHDT),更改时间(CHTM)

我需要根据创建日期和时间来提取最新的欧盟认证编号(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 个答案:

答案 0 :(得分:1)

也许这会有所帮助。我从第一组表格数据中构建了表格,查询演示了使用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 |