Есть запрос:
SELECT AVG([Freight]) [AVG], MIN(YEAR([OrderDate])) [Year], [EmployeeID] [Empl], [CustomerID] [Cust]
FROM [Northwind]..[Orders]
GROUP BY [EmployeeID], [CustomerID]
ORDER BY 1;
Возвращающий результат (список агрегатов по двум группам: служащему и заказчику, который может быть отсортирован по любому из полей):
AVG Year Empl Cust
0.12 1996 6 LILAS
0.15 1997 4 BLAUS
0.21 1998 1 COMMI
0.40 1996 7 PERIC
0.45 1996 1 LAMAI
0.53 1998 8 LONEP
0.56 1996 2 LONEP
0.82 1998 4 WILMK
1.10 1997 9 CACTU
1.21 1998 3 ALFKI
1.27 1998 4 OCEAN
1.28 1997 3 LONEP
1.30 1996 3 FURIB
1.35 1997 6 FOLIG
1.36 1998 1 GALED
…
Требуется отфильтровать выборку так, что бы в результате было бы не более пяти служащих ([Empl]) и у каждого служащего не более двух заказчиков ([Cust]):
AVG Year Empl Cust
0.12 1996 6 LILAS
0.15 1997 4 BLAUS
0.21 1998 1 COMMI
0.40 1996 7 PERIC
0.45 1996 1 LAMAI // + "1" встечается второй раз, поэтому не учитывается
0.53 1998 8 LONEP // + Вот это пятый служащий
//0.56 1996 2 LONEP // - Шестой служащий
0.82 1998 4 WILMK // + Второй заказчик у служащего "4"
//1.10 1997 9 CACTU
//1.21 1998 3 ALFKI
//1.27 1998 4 OCEAN // - Это третий заказчик у служащего "4", отпадает
//1.28 1997 3 LONEP
//1.30 1996 3 FURIB
1.35 1997 6 FOLIG
//1.36 1998 1 GALED // - Это третий заказчик у служащего "1", отпадает
…
Интересуют варианты для MSSQL (2008), Oracle (10, 11) и MySQL (тут я в нумерации не силён, но тоже можно использовать что-то из самого последнего).