Avoir un problème avec la sélection des lignes max par date

J'essaie de sélectionner les loggings horodatés maximum de la table 1 en fonction de certaines données de la table 2. J'obtiens les loggings corrects basés sur les limites où j'ai mis sur la requête, mais je reçois toujours des inputs dupliquées pas l'horodatage max. Entrées Des idées sur ce qui ne va pas avec la requête?

Fondamentalement, l'ID 901413368 a access à certains leveltypes et j'essaie de savoir quelles sont les requêtes datées max qui ont été mises en place pour cette même personne pour les leveltypes que cette personne gère.

SELECT MAX(timestamp) AS maxtime, Leveltype, assign_ID FROM WHERE (leveltype IN (SELECT leveltype FROM dbo.idleveltypes WHERE (id = 901413368))) GROUP BY timestamp, assign_ID, leveltype HAVING (assign_ID = '901413368') 

MISE À JOUR: Le problème a été résolu par la réponse de WEI_DBA ci-dessous:

 Remove the timestamp column from your Group By. Also put the assign_ID in the Where Clause and remove the Having clause 

Ce qui suit peut être ce que vous voulez. Il devrait également être un moyen plus simple d'écrire la requête:

 SELECT MAX(a.timestamp) AS maxtime, a.Leveltype, a.assign_ID FROM dbo.q_Archive a JOIN dbo.idleveltypes lt ON a.leveltype = lt.leveltype AND a.assign_ID = lt.id WHERE assign_ID = 901413368 GROUP BY assign_ID, leveltype; 

Remarques:

  • Filtrez sur assign_ID avant de faire le group by . C'est beaucoup plus efficace.
  • Une JOIN est la façon la plus typique de représenter la relation entre deux tables.
  • La condition JOIN doit être sur toutes les colonnes nécessaires pour la correspondance; il semble y en avoir deux.
  • Je ne comprends pas pourquoi la table leveltype aurait une colonne appelée id , mais c'est votre structure de données.
  • Le GROUP BY n'a pas besoin d' timestamp .
  • Décidez du type pour la colonne id qui devrait être 901413368 . Est-ce un nombre ou une string? N'utilisez que des guillemets simples pour les constantes de string et de date.

Supprimer l'horodatage de la clause GROUP BY en raison de l'obtention de MAX (horodatage)

Vous ne devez pas append de champs agrégés à la clause GROUP BY.

 SELECT MAX(timestamp) AS maxtime, Leveltype, assign_ID FROM dbo.q_Archive WHERE (leveltype IN (SELECT leveltype FROM dbo.idleveltypes WHERE (id = 901413368))) GROUP assign_ID, leveltype HAVING (assign_ID = '901413368')