2009-01-06 9 views
0

Quelqu'un peut-il m'aider avec la commande SQL suivante s'il vous plaît? Je ne suis pas très expérimenté en SQL.Aide avec la requête SQL

J'ai 2 tables:

Tableau pesages avec des colonnes:

  • WeighingId
  • FileId
  • MyDateTime

Tableau Fichiers avec colonnes:

  • FileID
  • Nom

Table pesages contient des informations lorsqu'un fichier spécifié a été pesé. J'ai besoin de faire une liste des dernières pesées de fichiers individuels, regroupés par nom de fichier. La table finale contiendrait Weighing.Id, le nom de fichier (File.Name) et la deuxième colonne lorsque ce fichier a été pesé la dernière fois MAX (Weighings.MyDateTime).

Il peut y avoir des noms de fichiers en double avec des fichiers différents.Id et j'ai besoin de regrouper tous les fichiers avec le même nom (donc je ne peux pas regrouper sur File.FileId).

Je tentais d'utiliser ce code, mais il ne fonctionne pas:

SELECT W.WeighingId AS WeighingId, MAX(W.MyDateTime) AS MaxMyDateTime 
FROM Files F INNER JOIN Weighings W ON W.FileId = F.FileId 
GROUP BY F.Name 
ORDER BY F.Name 

Merci pour votre aide, Petr

+0

Mec, regarde ma réponse. Vous n'êtes pas obligé de l'accepter mais cela résout votre problème. La syntaxe n'est peut-être pas parfaite car je l'ai écrite en fonction de votre description, mais vous devriez pouvoir la modifier. – wcm

Répondre

3
SELECT F.Name, 
     MAX(W.MyDateTime) AS MaxMyDateTime 
FROM Files F INNER JOIN Weighings W ON W.FileId = F.FileId 
GROUP BY F.Name 
ORDER BY F.Name 
1

« La table finale contiendra première colonne un nom de fichier (File.Name) et la deuxième colonne lorsque ce fichier a été pesé la dernière fois MAX (Weighings.MyDateTime). "

Votre SQL rétablit W.WeighingId en tant que première colonne, pas File.Name.

Fixez-le et cela devrait fonctionner.

0

Quelque chose comme:

select WeighingID 
    , f.Name 
    , f.FileID 
    , MaxMyDateTime = (SELECT MAX(Weighings.MyDateTime) FROM Files F INNER JOIN Weighings ON Weighings.FileId = Files.FileId WHERE File.Name = f.Name) 
from Weighings w 
    inner join Files f 
    on w.fileid=f.fileid 
0

Mes appologies, je dois obtenir Weighing.Id de dernière que pesages, de sorte que la table finale devrait également contenir Weighing.WeighingId.

0

Il devrait être aussi:

SELECT 
    F.Name, 
    (SELECT TOP 1 WeighingId FROM Weighings WHERE MyDateTime = MAX(W.MyDateTime)), 
    MAX(W.MyDateTime) AS MaxMyDateTime 
FROM Files F 
    INNER JOIN Weighings W ON W.FileId = F.FileId 
GROUP BY F.Name 
ORDER BY F.Name 

Vous n'avez pas besoin F.Name d'être dans la liste de sélection (le contraire n'est pas autorisé comme dans WeighingId en vous par exemple). Je suppose que le problème était comment vous pourriez agréger WeighingId pour sélectionner.