2008-10-02 6 views
1

J'ai une table qui ressemble à ce que:Pour ce faire, avec un seul SQL

alt text

Les lignes sont triées par CLNDR_DATE DESC.

Je dois trouver un CLNDR_DATE qui correspond à la ligne en surbrillance, autrement dit:
Trouver le groupe de lignes supérieure OU EFFECTIVE_DATE IS NOT NULL, et retourner le CLNR_DATE d'une dernière ligne de ce groupe.

Normalement j'ouvrirais un curseur et ferais un cycle de haut en bas jusqu'à ce que je trouve un NULL dans EFFECTIVE_DATE. Ensuite, je saurais que la date que je cherche est CLNDR_DATE, obtenue à l'étape précédente.

Cependant, je me demande si la même chose peut être réalisée avec un seul SQL?

+0

Ce que vous demandez ne semble pas être trop mauvais, mais pouvez-vous préciser un peu - vous dites que vous avez besoin pour saisir le premier enregistrement de la table après la last null dans effective_date? – Dr8k

Répondre

7

Avertissement: Pas un DBA par quelque moyen que ce soit. ;)

Mais, un coup de poignard rapide, non testé à elle:

SELECT min(CLNDR_DATE) FROM [TABLE] 
WHERE (EFFECTIVE_DATE IS NOT NULL) 
    AND (CLNDR_DATE > (
    SELECT max(CLNDR_DATE) FROM [TABLE] WHERE EFFECTIVE_DATE IS NULL 
)) 

En supposant que vous voulez que le premier CLNDR_DATE avec EFFECTIVE_DATE après la dernière sans.

Si vous voulez que le d'abord avec après la première sans, changer la sous-requête à utiliser min() au lieu de max().

0

Le premier résultat de ce jeu d'enregistrements est ce que vous cherchez. En fonction de votre base de données, vous pouvez être en mesure de revenir que cette ligne en utilisant LIMIT ou TOP

SELECT CLNDR_DATE 
FROM TABLE 
WHERE CLNDR_DATE > (SELECT MAX(CLNDR_DATE) 
        FROM TABLE 
        WHERE EFFECTIVE_DATE IS NOT NULL) 
ORDER BY CLNDR_DATE 
0

Lorsque vous êtes dans un environnement Oracle, vous pouvez utiliser les fonctions d'analyse (http://www.orafaq.com/node/55), qui sont des outils très puissants pour faire genre des requêtes que vous demandez. En utilisant le SQL standard, je pense que c'est impossible, mais peut-être que certains gourous de SQL montreront une bonne solution.

1

Utilisation de la fonction analytique d'Oracle (non testé)

select * 
from 
(
    select 
    clndr_date, 
    effective_date, 
    lag(clndr_date, 1, null) over (order by clndr_date desc) prev_clndr_date 
    from table 
) 
where effective_date is null 

Le lag(clndr_date, 1, null) over (order by clndr_date desc) renvoie le clndr_date précédent, ou utiliser null si cela est la première rangée.

(edit: ordre fixe)

+0

plus (commande par clndr_date DESC) fait le travail. Mais oui, trop lent :-( –

+0

L'avantage de ceci est qu'il vous montrera toutes les lacunes, et pas seulement les dernières, cela peut ou ne peut pas être ce que l'OP veut, probablement pas par l'apparence de celui-ci. –

Questions connexes