J'ai examiné plusieurs articles ici et je ne trouve pas la réponse, mais il se peut que le problème et la réponse soient un peu supérieurs à ma note de salaire.

J'ai une table MS Access avec deux champs ID (ID1 et ID2) et de nombreuses autres colonnes.

Je veux interroger (instruction SELECT) la table et j'ai besoin de deux choses. Je ne sais pas si la commande compte. Je veux que la requête renvoie toutes les colonnes de la table.

  • Pas de doublons pour ID1, et je ne me soucie tout simplement pas du ou des enregistrements qui seront jetés.
  • Pas de doublons pour ID2 et je souhaite conserver l'enregistrement où le champ Date de la table est antérieur aux autres valeurs pour les enregistrements avec la même valeur ID2.

Je ne peux tout simplement pas comprendre comment faire cela avec une instruction SQL Select.

Exemple de données - supposons que DateFld est ASC de haut en bas

ID1    ID2    DateFld    ...
1      24
1      24
2      23
3      98
4      23
4      23
5      98
6      72

Gardez les lignes 1, 3, 4, 8

Aucun index, car cette table a été créée à partir d'une requête de création de table; mais je peux les ajouter. Faites-moi savoir si vous avez besoin de plus.

0
JJJones_3860 22 sept. 2020 à 00:35

2 réponses

Meilleure réponse

Pour cet exemple de données, vous pouvez utiliser NOT EXISTS:

SELECT t.*
FROM tablename AS t
WHERE NOT EXISTS (
  SELECT 1 FROM tablename
  WHERE ID2 = t.ID2 AND DateFld < t.DateFld
)

Résultats:

ID1 ID2 DateFld
1   24  ...
2   23  ...
3   98  ...
6   72  ...
1
forpas 22 sept. 2020 à 16:14
SELECT
  ID1, 
  ID2, 
  [allOtherColumns]
FROM(
  SELECT 
      ID1, 
      ID2, 
      ROW_NUMBER() OVER (PARTITION BY ID1 ORDER BY ID1) AS ID1Selector, 
      ROW_NUMBER() OVER (PARTITION BY ID2 ORDER BY DateValue ASC) AS ID2Selector,
      [allOtherColumns)
  FROM tbl) AS InnerQry
WHERE ID1Selector=1 AND ID2Selector=1

Notez qu'il s'agit d'un code SQL Server qui pourrait fonctionner dans Access. Je n'ai pas beaucoup d'expérience avec Access, mais je connais SQL. En SQL, la fonction de fenêtre ROW_NUMBER () divisera ID1 par ID1 uniques de sorte que le premier ID1 rencontré sera le seul qu'il sélectionne, et ID2Selector donnera le numéro de ligne 1 à la valeur de date la plus ancienne rencontrée chez chaque individu ID2.

Il existe peut-être un moyen plus efficace de le faire, mais c'est ainsi que je le fais toujours en SQL.

-1
Tyler H 22 sept. 2020 à 00:45