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
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).
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 .
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
SELECT distinct
group,
max_date = MAX(date) OVER (PARTITION BY group), checks
FROM table
Devrait marcher.