Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS Access > Ограничение числа строк


Автор: Freazeek 8.9.2009, 11:33
Необходимо выбрать два максимальных значения внутри каждой группы

пример:
есть таблица
А    12
А    19
А    23
А    9
В    17
В    11
В    25

нужно получить

А    23
А    19
В    25
В    17

как составить запрос?

Заранее спасибо.

Автор: bopoha 8.9.2009, 11:43
Код

SELECT fld1, max(fld2) 
FROM tbl 
GROUP BY fld1


P.S. Учите матчасть!

Автор: Akina 8.9.2009, 12:01
bopoha, ему надо по ДВА. smile

Добавлено через 12 минут и 3 секунды
Код

SELECT q1.grp, q1.val
FROM 
(
  SELECT tbl.grp AS grp, tbl.val AS val, tbl_1.val AS val1
  FROM tbl 
  INNER JOIN tbl AS tbl_1 
  ON tbl.grp=tbl_1.grp
  WHERE tbl.val<=tbl_1.val
) AS q1
GROUP BY q1.grp, q1.val
HAVING Count(q1.val)<=2
ORDER BY q1.grp, q1.val DESC;

Автор: Zloxa 8.9.2009, 14:10
мои пять копеек.
На акццсесе, полагаю сработает. Сорри, если не так
Код

select grp
       ,val
from t t1
where 2>=(select count(t2.val) from t t2 where t1.grp = t2.grp and t1.val<=t2.val)

Фигово, если пара grp,val не уникальна.

Автор: bopoha 8.9.2009, 14:59
Упс, был не внимателен.

Автор: Freazeek 8.9.2009, 14:59
Большое спасибо

Автор: FINANSIST 10.9.2009, 10:54
Цитата(Akina @  8.9.2009,  12:01 Найти цитируемый пост)
SELECT q1.grp, q1.val
FROM 
(
  SELECT tbl.grp AS grp, tbl.val AS val, tbl_1.val AS val1
  FROM tbl 
  INNER JOIN tbl AS tbl_1 
  ON tbl.grp=tbl_1.grp
  WHERE tbl.val<=tbl_1.val
) AS q1
GROUP BY q1.grp, q1.val
HAVING Count(q1.val)<=2
ORDER BY q1.grp, q1.val DESC;

ОФФТОП:  До этого дня даже не мыслил что такое возможно smile  - гибкости языка SQL и мышлению некоторых участников форума не перестою удивляться
Правда я не понял, зачем 
Цитата(Akina @  8.9.2009,  12:01 Найти цитируемый пост)
HAVING Count(q1.val)<=2

когда можно весь запрос привести в более компактный вид:
Код

select distinct grp,  val1 from (SELECT tbl.grp AS grp, tbl.val AS val, tbl_1.val AS val1
FROM tbl INNER JOIN tbl AS tbl_1 ON tbl.grp = tbl_1.grp
WHERE (tbl.val<=[tbl_1].[val] AND tbl_1.val>[tbl].[val]))

Как мне кажется, такой запрос будет более шустрый в работе...

Автор: Akina 30.9.2009, 16:57
Цитата(FINANSIST @  10.9.2009,  11:54 Найти цитируемый пост)
можно весь запрос привести в более компактный вид

а ты запускал этот свой "более компактный вид"? smile 

Автор: FINANSIST 1.10.2009, 12:38
Цитата(Akina @  30.9.2009,  16:57 Найти цитируемый пост)
а ты запускал этот свой "более компактный вид"?   

по исходной таблице
Код

grp    val
A    12
A    19
A    23
B    17
B    11
B    25
C    24
C    26
C    18


запрос ЗАПУСКАЕТСЯ и возвращает следующий результат
Код

grp    val1
A    19
A    23
B    17
B    25
C    24
C    26

Однако, если элементов больше 3-х в группе он действительно некорректен в том плане что будет выдавать не первые 2 а первые N-1 из N  элементов группы

Автор: Akina 1.10.2009, 17:19
Иными словами, он неверен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)