web-dev-qa-db-fra.com

Sélectionnez les informations dans la table où la ligne a une date maximale

Ma table ressemble à ceci:

group    date      cash  checks
  1    1/1/2013     0      0
  2    1/1/2013     0      800
  1    1/3/2013     0      700
  3    1/1/2013     0      600
  1    1/2/2013     0      400
  3    1/5/2013     0      200

- Vous n'avez pas besoin d'argent pour démontrer que la table contient plus d'informations

Je veux obtenir chaque groupe unique où la date est au maximum et les vérifications sont supérieures à 0. Le retour ressemblerait à quelque chose comme:

group    date     checks
  2    1/1/2013    800
  1    1/3/2013    700
  3    1/5/2013    200

tentative de code:

SELECT group,MAX(date),checks
    FROM table
    WHERE checks>0
    GROUP BY group
    ORDER BY group DESC

le problème avec ça, c’est qu’il me donne toutes les dates et tous les contrôles plutôt que la ligne de date maximum.

en utilisant ms SQL Server 2005

33
kqlambert
SELECT group,MAX(date) as max_date
FROM table
WHERE checks>0
GROUP BY group

Cela fonctionne pour obtenir la date maximale..rouez-le à vos données pour obtenir les autres colonnes:

Select group,max_date,checks
from table t
inner join 
(SELECT group,MAX(date) as max_date
FROM table
WHERE checks>0
GROUP BY group)a
on a.group = t.group and a.max_date = date

La jointure interne fonctionne en tant que filtre pour obtenir le nombre maximal d'enregistrements.

Pour votre information, vos noms de colonnes sont horribles, n'utilisez pas de mots réservés pour les colonnes (groupe, date, table).

90
Twelfth

Vous pouvez utiliser un window MAX () comme ceci:

SELECT
  *, 
  max_date = MAX(date) OVER (PARTITION BY group)
FROM table

pour obtenir le nombre maximal de dates par group à côté d'autres données:

group  date      cash  checks  max_date
-----  --------  ----  ------  --------
1      1/1/2013  0     0       1/3/2013
2      1/1/2013  0     800     1/1/2013
1      1/3/2013  0     700     1/3/2013
3      1/1/2013  0     600     1/5/2013
1      1/2/2013  0     400     1/3/2013
3      1/5/2013  0     200     1/5/2013

En utilisant la sortie ci-dessus en tant que table dérivée, vous ne pouvez obtenir que les lignes où date correspond à max_date:

SELECT
  group,
  date,
  checks
FROM (
  SELECT
    *, 
    max_date = MAX(date) OVER (PARTITION BY group)
  FROM table
) AS s
WHERE date = max_date
;

pour obtenir le résultat souhaité.

Fondamentalement, cela ressemble à la suggestion de @ Twelfth mais évite une jointure et peut donc être plus efficace.

Vous pouvez essayer la méthode at SQL Fiddle .

25
Andriy M

vous pouvez utiliser join comme ceci. Si vous utilisez IN, cela sera lent, essayez de l'éviter.

    SELECT *  FROM (SELECT  msisdn, callid, Change_color, play_file_name, date_played FROM insert_log
   WHERE play_file_name NOT IN('Prompt1','Conclusion_Prompt_1','silent')
 ORDER BY callid ASC) t1 JOIN (SELECT MAX(date_played) AS date_played FROM insert_log GROUP BY callid) t2 ON t1.date_played=t2.date_played
1
SELECT distinct
  group, 
  max_date = MAX(date) OVER (PARTITION BY group), checks
FROM table

Devrait marcher.

0
Heather WWW