2017-10-10 11 views
0

J'ai tout à fait une requête à écrire. J'ai un fichier appelé FG500 qui a un champ appelé UTXT (numéro de certification). La clé (non unique) pour le fichier est numéro de modèle (MODL). Le fichier peut contenir plusieurs lignes avec les numéros de modèle. Il a également créer la date (CRDT), créer l'heure (CRTM), changer la date (CHDT), Changer l'heure (CHTM)déclaration de cas dans le numéro de clause Where

Je dois tirer le dernier numéro de certification EU (UTXT) basé sur la date de création & Heure/Date de modification & Heure. C'est-à-dire, si la date/Heure de changement n'est pas 0, alors tirez le dernier de cela .. Sinon, vérifiez la date de création et tirez le dernier enregistrement de cela.

je vais devoir utiliser un cas mais pas sûr de savoir comment. Toute aide est grandement appréciée. données Exemple:

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 

Résultat attendu serait un vide que la date de changement le plus élevé/Le temps est le premier enregistrement. Si la date de changement avait été vide, alors j'aller de l'avant avec la création de date/heure

+1

Ajoutez quelques données de la table d'échantillons et le résultat attendu - sous forme de texte formaté, pas des images. – jarlh

+0

Supposons-nous que c'est pour 'db2'? (Les saveurs de 'sql' diffèrent par dbms.) Quelle est la pertinence de' rpgle' pour cette question? –

+0

Oui, cela est pour DB2 .. –

Répondre

0

Peut-être que cela aidera. J'ai construit la table à partir de votre premier ensemble de données tabulaires, et la requête démontre l'utilisation de ROW_NUMBER() pour arriver à la "dernière" ligne pour chaque numéro de modèle. J'ai utilisé MS SQL Server à partir de cet exemple car la syntaxe de requête pour DB2 est similaire.

Cela pourrait ne pas être une réponse complète, et que je n'ai pas accès à DB2 je ne suis pas en mesure de démontrer comment combiner les colonnes de date et l'heure qui devrait vraiment être fait.

SQL Fiddle

MS SQL Server 2014 Configuration du schéma:

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') 
; 

Requête 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

Lors de la présentation de "données d'exemple", utilisez une disposition rangée par rangée (comme vous l'avez fait initialement) et indentez chaque rangée à partir de la gauche avec 4 espaces . Il sera alors vu comme une table (comme les tables vues plus haut). –

+0

Merci beaucoup!Voici la dernière requête que j'ai utilisée: Sélectionnez COALESCE ((SELECT UTXT FROM FG500F OERE MODL = 'L12G4AGAEA' et UTxT <> '' ORDER BY CHGDTE desc, CHGTIM desc, CRTDTE desc, CRTTIM desc récupère la première ligne seulement), ' ') à partir de sysibm/SYSDUMMY1 –