0 votes

Besoin d'aide avec les requêtes (vues) dans Microsoft Access

J'ai une application qui enregistre le poids d'un bac contenant des articles en stock dans une table Microsoft Access :

Id(AutoNumber)  Timestamp       Weight
-------------------------------------
1                Jan 1           1
2                Jan 2           1

3                Jan 3           2
4                Jan 4           2
5                Jan 5           2

6                Jan 6           3
7                Jan 7           3
8                Jan 7           3

9                Jan 8           2
10               Jan 8           2

11               Jan 9           7

12               Jan 10          4
13               Jan 10          4

Notez que le poids peut varier d'un jour à l'autre. Parfois, le poids ne change pas pendant plusieurs jours. Je veux produire un rapport indiquant uniquement le poids lorsqu'il a changé et ne pas répéter la ligne si le poids n'a pas changé, comme suit (le champ ID n'est pas nécessaire) :

Timestamp       Weight
----------------------
  Jan 1           1

  Jan 3           2

  Jan 6           3

  Jan 8           2

  Jan 9           7

  Jan 10          4

Je peux le faire en utilisant du code soit en VB, soit dans un module Access, en l'écrivant dans une table temporaire, etc. Mais existe-t-il un moyen de le faire en utilisant simplement des requêtes SQL (vues), y compris des sous-requêtes ? Je pense que je devrais pouvoir écrire une requête en utilisant la clause GROUP By pour obtenir le 'PREMIER' élément et une autre requête à joindre à la première, mais j'ai l'impression que cela ne peut pas être fait du tout sans écrire du code. (Cette application sera sur un site web - Access n'est pas adapté aux tables temporaires pour plusieurs utilisateurs).

0voto

shahkalpesh Points 21553
select o.dt, o.value from table1   o
where not exists (select top 1 t.dt, t.value from table1 t where t.dt < o.dt )
union 
select o.dt, o.value from table1   o
where exists (select top 1 t.dt, t.value from table1 t where t.dt = (o.dt - 1) and 
t.value <> o.value)

Note : Je suppose que dt est le champ date et que value est le champ poids.
Vous pouvez baser votre requête sur ceci.

J'espère que cela vous aidera.

0voto

onedaywhen Points 24594

Je ne pense pas que vous puissiez utiliser votre timestamp colonne pour la commande parce que pour autant que je sache elle ne fournit pas de clé. Étant donné que plusieurs netwt pour le même timestamp par exemple

80001   '2009-07-22 09:28:23'   0.55
80002   '2009-07-22 09:28:23'   0.22
80003   '2009-07-22 09:28:23'   0.99

vous ne pouvez pas connaître l'ordre sans le id colonne.

En l'état actuel des choses, le id semble indiquer l'ordre mais il s'agit peut-être d'une hypothèse peu sûre (par exemple, il est possible de INSERT un explicite id qui pourraient être hors séquence).

[BTW TIMESTAMP est un mot réservé à l'engin de la base de données Access, aux normes SQL SQL-92, ODBC, SQL Server Future, etc. et doit donc être évité comme nom d'élément de données].

L'exemple suivant utilise la colonne id pour l'ordonnancement afin de déterminer si la valeur nette suivante est différente :

SELECT T3.id, T3.[timestamp], T3.netwt
  FROM table1 AS T3
 WHERE EXISTS (
               SELECT MIN(T2.id)
                 FROM table1 AS T1, table1 AS T2
                WHERE T1.id < T2.id
                      AND T1.netwt <> T2.netwt
                GROUP 
                   BY T1.id
               HAVING MIN(T2.id) = T3.id
              );

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X