Pour sélectionner les enregistrements N par catégorie, on peut faire:Comment interroger EFFICACEMENT n enregistrements par catégorie
SELECT category, category_id, value FROM
(
SELECT category, value, row_number() OVER (PARTITION by category) as category_id
FROM myTable
)
WHERE category_id < N;
La SELECT INNER première partition les enregistrements par catégorie et à chaque dossier par catégorie un identifiant appelé category_id. La requête externe utilisera ensuite l'attribut category_id pour limiter le nombre d'enregistrements qu'il interroge par catégorie.
Ceci est extrêmement inefficace sur les tables BIG car il va en attribuant des identifiants à tous les enregistrements même si nous ne sommes intéressés que par N enregistrements par catégorie. Ce qui suit ne fonctionne pas sur le moteur SQL avec lequel je travaille - je ne sais pas si cela fonctionne sur un moteur du tout.
SELECT category, value, row_number() OVER (PARTITION by category) as category_id
FROM myTable
WHERE category_id < N
Est-ce que quelqu'un connaît d'autres façons d'y parvenir avec une meilleure complexité dans le temps?
Plus pensées:
temps de profilage l'algorithme suivant contre requête ci-dessus pourrait fournir plus d'idées sur la façon dont la requête passe derrière la scène:
1. SELECT DISTINCT(category) FROM myTable
2. FOREACH category SELECT N rows
plus d'informations: mes données être physiquement partitionné par category
, être en mesure d'exploiter explicitement ce qui serait utile
même si votre deuxième requête travaillerait sur certains SGBDR, le plan d'exécution serait probablement le même que le premier – Lamak
vous pouvez essayer de vider votre table dérivée dans un #temp et créer un index sur cela, puis l'interroger – LONG
Marquer votre question avec la base de données que vous utilisez. –