2010-02-09 3 views
6

Je dois obtenir le premier enregistrement du même client inséré dans une heure. Si l'enregistrement est inséré après une heure, alors n'en avez pas besoin. Veuillez vous référer au tableau suivant. Ceci est juste un échantillon de 1000 enregistrements. J'utilise SQL Server 2005.Obtenir le premier enregistrement du même FK sur la différence de date

alt text http://img651.imageshack.us/img651/3990/customershavingmultiple.png

+0

En utilisant une image comme exemple casse votre question si votre navigateur/proxy refuse de montrer le contenu 3ème partie. Y a-t-il une raison pour ne pas montrer un tableau de texte? – Unsliced

+0

Un grand merci d'avoir mentionné cela, Unsliced. Il n'y a pas de raison particulière de montrer une question dans l'image. Je m'en occuperai à l'avenir. – Kashif

Répondre

1

L'idée est la suivante

  • Sélectionner tous enfant commandes dans une heure avec son minimum possible (Parent) ID. (Je suppose ici que le plus bas OrderID sera aussi le le plus ancien OrderID).
  • Joignez-vous à ces résultats avec le tableau original.
  • Utilisez ces résultats comme base de l'instruction de mise à jour.

Déclaration SQL

UPDATE Orders 
SET  ParentOrderID = p.ParentOrderID 
FROM Orders o 
     INNER JOIN (
      SELECT ParentOrderID = MIN(o1.OrderID), OrderID = o2.OrderID 
      FROM Orders o1 
        LEFT OUTER JOIN Orders o2 ON 
        o2.CustomerID = o1.CustomerID 
        AND o2.OrderDate > o1.OrderDate 
        AND DATEADD(hh, -1, o2.OrderDate) < o1.OrderDate 
      GROUP BY o2.OrderID 
     ) p ON p.OrderID = o.OrderID 
+0

Merci beaucoup @Lieven. C'est très gentil de votre part. J'ai vu votre photo de profil. Je pense que tu es avec ta famille. Bonne photo. – Kashif

+0

Dans le cas où vous vous demandez, la grande masse laide est ci-dessous est moi. –

0
select Top 1 * 
from (select orderid, customerid, orderdate, parentorderid from customer where [email protected]) 
where DATEDIFF(mi, orderdate, GETDATE()) > 60 

commande par OrderDate

Remarque J'ai utilisé une sous requête ici pour filtrer la première customerid afin que vous obtiendrez de meilleures performances. Vous devriez essayer d'éviter d'utiliser des fonctions (DATEDIFF) dans une clause de restriction sur de grandes séries de la date

1

Compte tenu du tableau suivant:

CREATE TABLE [dbo].[Orders](
    [OrderID] [int] IDENTITY(1,1) NOT NULL, 
    [CustomerID] [int] NULL, 
    [OrderDate] [datetime] NULL, 
    CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED 
    (
     [OrderID] ASC 
    ) 
) 

la déclaration suivante montre la dernière commande passée par un client dans le délai suivi par les autres ordres.

;With OrderList As 
(
Select Top 100 Percent * From dbo.Orders 
Where OrderDate >= DateAdd(hh, -1, GetDate()) 
Order By OrderDate Desc 
) 
Select 'First' As DataType, 
    CustomerID, Min(OrderID) As OrderID, Min(OrderDate) As OrderDate 
From OrderList 
Group By CustomerID 
Union All 
Select 'Second' As DataType, 
    CustomerID, OrderID, OrderDate 
From OrderList 
Where OrderID Not In 
(
    Select Min(OrderID) As OrderID 
    From OrderList 
    Group By CustomerID 
) 
--Union All 
--Select 'Raw' As DataType, 
-- CustomerID, OrderID, OrderDate 
--From Orders 

La dernière partie est commentée car je l'ai utilisée pour tester si j'ai réellement les bonnes lignes. En résumé, l'instruction With limite les commandes de la table à celles passées dans la dernière heure en fonction de la date système en cours et les commande par date de commande. La première instruction (Sélectionnez 'First') extrait ensuite seulement les premières commandes par le client. La deuxième instruction (Sélectionnez 'Second') extrait ensuite tous les autres ordres qui ne figurent pas dans la première instruction.

Cela devrait fonctionner comme prévu, Muhammed, mais je n'ai pas 1000 lignes de lignes pour le tester. Les performances devraient être correctes car la partie With va créer une table temporaire avec laquelle travailler.

Questions connexes