


Comment sélectionner la première ligne de chaque groupe par groupe en SQL?
To select the first row in each GROUP BY
group in SQL, you typically need to use window functions, as standard GROUP BY
doesn't guarantee row order or let you directly pick a full row based on ranking within the group.

The most reliable and widely supported approach (in databases like PostgreSQL, SQL Server, Oracle, SQLite 3.25+, MySQL 8.0+) is to use the ROW_NUMBER()
window function.
✅ Recommended Method: Use ROW_NUMBER()
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY group_column ORDER BY some_column) AS rn FROM your_table ) t WHERE rn = 1;
Explanation:
PARTITION BY group_column
: Defines the groups (same asGROUP BY
).ORDER BY some_column
: Determines which row is "first" — for example, the earliest date, highest value, etc.ROW_NUMBER()
: Assigns a unique number starting at 1 within each group.- The outer query filters to keep only the first row (
rn = 1
) from each group.
Example:
Suppose you have a table orders
and want the first order (by date) for each customer:

SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS rn FROM orders ) t WHERE rn = 1;
This gives one row per customer_id
— the earliest order.
⚠️ Notes:
- Order matters: Always specify a meaningful
ORDER BY
insideOVER()
to control which row is considered "first". - Ties:
ROW_NUMBER()
assigns arbitrary unique numbers even if values are tied. If you want all tied rows, useRANK()
instead. - Older MySQL versions (< 8.0): Don't support window functions. You'd need workarounds with self-joins or variables (not recommended if you can upgrade).
❌ What Doesn't Work Reliably:
SELECT * FROM your_table GROUP BY group_column;
This is invalid in most SQL databases unless all selected columns are aggregated or functionally dependent on the group. Even in MySQL with sql_mode
relaxed, it picks an arbitrary (not necessarily first) row.

Alternative: Using DISTINCT ON
(PostgreSQL only)
If you're using PostgreSQL, a cleaner syntax is available:
SELECT DISTINCT ON (group_column) * FROM your_table ORDER BY group_column, some_column;
This picks the first row per group_column
based on the ORDER BY
.
In short: use ROW_NUMBER()
for portable, clear, and reliable results. It's the standard way to get the first row per group in modern SQL.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Installer le pilote de base de données correspondant; 2. Utilisez Connect () pour se connecter à la base de données; 3. Créez un objet de curseur; 4. Utilisez EXECUTE () ou Execumany () pour exécuter SQL et utiliser une requête paramétrée pour empêcher l'injection; 5. Utilisez fetchall (), etc. pour obtenir des résultats; 6. commit () est requis après modification; 7. Enfin, fermez la connexion ou utilisez un gestionnaire de contexte pour le gérer automatiquement; Le processus complet garantit que les opérations SQL sont sûres et efficaces.

Pour calculer la différence entre deux dates, vous devez sélectionner la fonction correspondante en fonction du type de base de données: 1. Utilisez DADAFIF () pour calculer la différence de jour dans MySQL, ou spécifiez les unités telles que l'heure et la minute dans TimeStampDiff (); 2. Utilisez DADAIFF (DATE_PART, START_DATE, END_DATE) dans SQLServer et spécifiez les unités; 3. Utilisez la soustraction directe dans PostgreSQL pour obtenir la différence de jour, ou utilisez l'extrait (dayFromage (...)) pour obtenir des intervalles plus précis; 4. Utilisez la fonction Julianday () pour soustraire la différence de jour dans SQLite; Faites toujours attention à la commande de date

Le cube est utilisé pour générer une agrégation de toutes les combinaisons de dimensions, adaptées à une analyse croisée; Rollup est progressivement résumé aux niveaux hiérarchiques, adapté aux données avec des relations hiérarchiques. Cube génère un total de 8 combinaisons selon la région, le produit et le trimestre, tandis que Rollup génère un résumé de l'année, du mois, du jour et d'autres niveaux selon l'année, le mois et le jour. Cube convient à la visualisation de tous les résultats transversaux, Rollup convient à l'affichage des hiérarchies. Notez que Cube peut faire exploser l'ensemble de résultats et Rollup dépend de l'ordre sur le terrain. La ligne récapitulative peut être identifiée via la fonction de groupement (), et la ligne totale est nommée avec coalesce pour améliorer la lisibilité.

Pour optimiser les performances de OrderBy dans SQL, vous devez d'abord comprendre son mécanisme d'exécution et utiliser rationnel de l'index et de la structure de requête. Lorsque le champ de tri n'a pas d'index, la base de données déclenchera "FilesTort", consommant beaucoup de ressources; Par conséquent, le tri direct de grandes tables doit être évité et la quantité de données triées doit être réduite dans les conditions. Deuxièmement, l'établissement d'un indice de correspondance pour les champs de tri peut considérablement accélérer les requêtes, telles que la création d'index de commande inverse dans MySQL 8.0 pour améliorer l'efficacité. De plus, la pagination profonde (telle que Limit1000, 10) doit être utilisée à la place avec une pagination de curseur basée sur l'indice (comme le cas échéant> 12345) pour sauter des analyses non valides. Enfin, la combinaison de la mise en cache, de l'agrégation asynchrone et d'autres moyens peut également optimiser davantage les performances de tri dans les scénarios d'ensemble de données importants.

BlobstoresbinaryDatalikeImages, Audio, Orpdfsasrawbytes withoutCharacterencoding, tandis que les opérations de tassement de tassement

GrantandrevokeStAtsAtsAtSAUSEUSTANAGEUSERPERMISSIONSINSISQL.1.GrantprovidesPrivilegeslikeSelect, Insérez, mettez à jour, supprimez, altez, exécutez, orallprivilegesondatabaseObjectSorsorroles.2

UseExistsforexistenCheckckcks, en particulier avec une corrélation corrélée et de savoir quand les valeurs de base, asitstopthefirstmatchandhandlesnullsafely; useinformmershipchecksagainstsmall, connu, ornon-nullvaluestswhereadabilitymattersperformanceisnotcrirscricri

Utilisez la clause ayant pour filtrer les données groupées après GroupBy, en particulier lorsque les conditions impliquent des fonctions d'agrégation telles que Count (), SUM (), AVG (); 2. Contrairement à la clause WHERE, où est utilisée pour filtrer une seule ligne avant le regroupement, tout en ayant est utilisée pour filtrer les groupes en fonction du résultat d'agrégation après le regroupement; 3. Avoir doit être placé après GroupBy, et l'alias de colonne dans SELECT ne peut pas être utilisé et l'expression agrégée doit être répétée; 4. où et avoir peut être utilisé en même temps, le premier filtre la ligne d'origine et le second filtre les résultats du regroupement; 5. Les scénarios d'application courants comprennent la recherche de clients dont le numéro de commande dépasse la valeur spécifiée, les départements dont le salaire moyen est supérieur à une certaine valeur ou excluant les groupes avec des valeurs nulles; 6. Total
