2013-08-28 5 views
0

J'ai une table qui a des données qui ressemble à ceci:sélectionner plusieurs valeurs récentes dans une seule instruction sql

data_type, value, datetime 
World of Warcraft, 500, 2012-12-02 
Quake 3, 1500, 2013-12-02 
Quake 3, 1400, 2013-02-04 
World of Warcraft, 1200, 2013-05-20 
Final Fantasy, 100, 2013-02-03 
Final Fantasy, 500, 2013-03-05 

Ce que je veux choisir quelque chose comme ce qui suit:

 
data_type, value 
World of Warcraft, 1200 
Quake 3, 1500 
Final Fantasy, 500 
select 
    most recent value for 'World of Warcraft', 
    most recent value for 'Quake 3', 
    most recent value for 'Final Fantasy' 

Donc, je reçois la valeur la plus récente de chacun d'entre eux dans une seule déclaration plutôt que d'avoir à les séparer. Comment ferais-je cela?

+0

duplication possible de [Sélection de plusieurs valeurs Max() en utilisant une instruction SQL unique - postgresql] (http://stackoverflow.com/questions/18494829/selecting-multiple-max-values-using-a-single-sql -statement-postgresql) –

+0

je n'ai pas, celui-ci demande sur la sélection du plus récent où l'autre demande la valeur maximale http://stackoverflow.com/questions/18494829/selecting-multiple-max-values-using -a-single-sql-statement-postgresql Si vous lisez les commentaires, la personne qui a aidé était celle qui suggérait réellement une nouvelle question. Mais merci pour l'aide .... – user2146933

+0

@a_horse_with_no_name Ceci est en fait une question différente – Lamak

Répondre

2

Cela devrait faire:

SELECT * 
FROM ( SELECT *, 
       ROW_NUMBER() OVER(PARTITION BY data_type 
            ORDER BY datetimecol DESC) AS RN 
     FROM YourTable) AS A 
WHERE RN = 1 

Il est en fait une fonction last_value sur Postgresql, mais je ne suis pas familier avec elle.

Si vous souhaitez que les données apparaissent dans les colonnes, vous pouvez utiliser:

SELECT 
    max(case when data_type='World of Warcraft' then value end) WorldofWarcraft, 
    max(case when data_type='Quake 3' then value end) Quake3, 
    max(case when data_type='Final Fantasy' then value end) FinalFantasy 
FROM ( SELECT data_type, value, datetime, 
       ROW_NUMBER() OVER(PARTITION BY data_type 
            ORDER BY datetimecol DESC) AS RN 
     FROM YourTable) AS A 
WHERE RN = 1 
+0

Je crois qu'ils veulent aussi les résultats dans des colonnes séparées, donc vous pourriez vouloir le faire pivoter. :) – Taryn

+0

@bluefeet Oh, je ne m'en suis pas rendu compte, puisque le premier jeu de résultats qu'il a posté était sur des lignes différentes. Mais vous avez raison de dire que la pseudo-requête qu'il a posté suggère de pivoter. Trop de travail, nous avons besoin de quelqu'un avec plus d'expertise à ce sujet :-) – Lamak

+0

Voilà! – Taryn

0

Un autre cas pour DISTINCT ON. Beaucoup plus simple et plus rapide:

SELECT DISTINCT ON (data_type) 
     data_type, value 
FROM tbl 
ORDER BY data_type DESC, datetime DESC; 

Vous pouvez inclure ou exclure les colonnes que vous aimez. Plus d'explications et de détails:
Select first row in each GROUP BY group?

J'utilise data_typeDESC, puisque votre exemple indique que vous voulez descendre pour que vos types de données. Omettez DESC si vous ne vous en souciez pas.

Vous devriez également normaliser vos données. Créez une table de recherche pour vos types de données et ne stockez que la clé étrangère dans votre table principale. Example.

Questions connexes