Difficile instruction SQL SELECT - combiner deux lignes en deux colonnes
Mon problème:
J'ai une table avec un Channel <int>
et un Value <float>
colonne, avec un horodatage et un couple de d'autres colonnes avec des données supplémentaires. Channel
est soit 1
ou 2
, et il y est 1 ou 2 lignes qui ont tout sauf le canal et la valeur de la même.
Ce que je voudrais faire est de sélectionner ces données sous une nouvelle forme, où les deux canaux apparaissent comme des colonnes. J'ai essayé de faire quelque chose avec GROUP BY
, mais je ne pouvais pas comprendre comment obtenir les valeurs dans les colonnes appropriées basées sur le canal sur la même ligne.
Exemple:
Pour ceux d'entre vous qui plutôt regarder les données que j'ai et les données que je veux et de le comprendre à partir de là, il est ici. Ce que j'ai:
Channel Value Timestamp OtherStuff
1 0.2394 2010-07-09 13:00:00 'some other stuff'
2 1.2348 2010-07-09 13:00:00 'some other stuff'
1 24.2348 2010-07-09 12:58:00 'some other stuff'
2 16.3728 2010-07-09 12:58:00 'some other stuff'
1 12.284 2010-07-09 13:00:00 'unrelated things'
2 9.6147 2010-07-09 13:00:00 'unrelated things'
Ce que je veux:
Value1 Value2 Timestamp OtherStuff
0.2394 1.2348 2010-07-09 13:00:00 'some other stuff'
24.2348 16.3728 2010-07-09 12:58:00 'some other stuff'
12.284 9.6147 2010-07-09 13:00:00 'unrelated things'
Mise à jour en réponse à certaines questions qui surgissent dans les commentaires, et quelques questions/précisions:
-
Oui, c'est la combinaison de
Timestamp
etOtherStuff
qui relie les deux lignes ensemble. (OtherStuff
est en fait plus d'une colonne, mais je l'ai simplifié pour des raisons de concision.) Il ya aussi un couple de d'autres colonnes qui ne sont pas nécessairement égaux, mais elle doit être juste comme ils sont. -
La table en question est déjà rejoint à partir de deux tables, où
Value
,Channel
etTimestamp
vient de l'un d'entre eux, et le reste (un total de plus de 7 colonnes, dont 4 sont toujours égaux pour "relier" les lignes, et les trois autres sont pour la plupart pas). Il y a eu un couple de suggestions en utilisantINNER JOIN
- ci seront-elles encore si je suis déjà rejoindre des trucs ensemble (même si je n'ai pas demyTable
à se joindre à lui-même)? -
Il y a beaucoup de lignes à la même heure, donc j'ai besoin des informations des tables, je me joins à comprendre les lignes de lier ensemble.
-
J'ai beaucoup de données. Les données proviennent des appareils de mesure stationnés dans tout le pays, et la plupart (si pas tous) de télécharger des mesures (jusqu'à 4 canaux) toutes les 2 minutes. Aujourd'hui nous avons environ 1000 appareils en ligne, donc cela signifie une addidtion de moyenne d'environ 1000 lignes de chaque minute. J'ai besoin de tenir compte des valeurs qui sont au moins 3, de préférence 6, heures, ce qui signifie 180 000 à 360 000 lignes dans la table avec le canal, la valeur et l'horodatage.
- ce qui relie les 2 lignes? l'horodatage et la otherstuff?
- Juste posé une question qui est inverse 🙂 !
Vous devez vous connecter pour publier un commentaire.
Tant que vous avez quelque chose qui relie les 2 lignes, quelque chose comme cela
Si vous n'avez pas quelque chose qui relie les 2 rangs, alors il ne peut probablement pas être fait car, comment savez-vous qu'ils sont jumelés?
Si vous avez 1 ou 2 lignes (edit: et ne savez pas quel canal de la valeur que vous avez)
Quelque chose comme...
(Je n'ai pas testé!)
(et cela suppose que votre Valeur est toujours positive!)
Sinon (voir les commentaires ci-dessous)...
Écrit sans l'éditeur de requête. S'il vous plaît être gentil 🙂
EDIT:
INNER JOIN
peut également être utilisée ici.EDIT2: Corrigé avec
INNER JOIN
. Ne vous précipitez pas pour downvote 🙂JOIN
syntaxe (ms-access). Et il m'a fallu un peu de temps pour penser à uneJOIN
.