Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 групповая выборка по нескольким полям  [new]
Dzib
Member

Откуда:
Сообщений: 24
Здравствуйте,

Нужен совет, кому интересно прошу ответить.

Есть независимая одна таблица. Например STUDENT у нее столбцы ID, NAME, NATIONALITY, DIRRECTION, DATE

Нужно отсортировать по дате начиная от старшей и вернуть первых 10 строк, с уникальной парой NATIONALITY и DIRRECTION.
Не важно какой один из множества студентов с одинаковыми NATIONALITY и DIRRECTION буду возвращены.


Спасибо за ответы.
29 окт 15, 23:12    [18346664]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
контрольный пример приготовь хотя бы, чтобы было на чем запрос попробовать.
30 окт 15, 00:02    [18346781]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
hardhouse
Member

Откуда:
Сообщений: 51
пример:
with t as (
    select 'name1' as name, 'nat1' as nationality, 'dir1' as dirrection, to_date('11.11.2000','dd.mm.yyyy') as dt from dual union all
    select 'name1' as name, 'nat1' as nationality, 'dir1' as dirrection, to_date('11.11.2000','dd.mm.yyyy') as dt from dual union all
    select 'name2' as name, 'nat2' as nationality, 'dir2' as dirrection, to_date('10.11.2000','dd.mm.yyyy') as dt from dual union all
    select 'name3' as name, 'nat3' as nationality, 'dir3' as dirrection, to_date('09.11.2000','dd.mm.yyyy') as dt from dual union all
    select 'name4' as name, 'nat4' as nationality, 'dir4' as dirrection, to_date('08.11.2000','dd.mm.yyyy') as dt from dual
)
select name, nationality, dirrection, min(dt) as o_dt from t
group by name, nationality, dirrection having count(*)=1
order by o_dt desc
fetch first 2 row only;


если последняя кляуза не подходит - используйте row_number()
30 окт 15, 00:49    [18346831]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
Dzib
Member

Откуда:
Сообщений: 24
Спасибо большое, как то сложно очень.
Хорошо, но давайте изменим сортировку не по дате а по ID. От меньшей к большей. Дату уберем.

CREATE TABLE STUDENT (
         ID      INTEGER,
         NAME      VARCHAR2(255) NOT NULL,
         NATIONALITY    VARCHAR2(255) NOT NULL,
         DIRRECTION      VARCHAR2(255) NOT NULL
         )

INSERT INTO STUDENT VALUES (3, 'Andrew', 'US', 'Math');
INSERT INTO STUDENT VALUES (2, 'Ostin', 'US', 'Math');
INSERT INTO STUDENT VALUES (1, 'Andy', 'US', 'Math');
INSERT INTO STUDENT VALUES (5, 'Bob', 'UK', 'Math');
INSERT INTO STUDENT VALUES (4, 'Greg', 'PL', 'Math');


В конечном итоге должно вернуть такие строки:
1 Andy US Math
4 Greg PL Math
5 Bob UK Math
30 окт 15, 00:51    [18346834]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
Alhymik
Member

Откуда:
Сообщений: 126
Dzib
Спасибо большое, как то сложно очень.
Хорошо, но давайте изменим сортировку не по дате а по ID. От меньшей к большей. Дату уберем.

CREATE TABLE STUDENT (
         ID      INTEGER,
         NAME      VARCHAR2(255) NOT NULL,
         NATIONALITY    VARCHAR2(255) NOT NULL,
         DIRRECTION      VARCHAR2(255) NOT NULL
         )

INSERT INTO STUDENT VALUES (3, 'Andrew', 'US', 'Math');
INSERT INTO STUDENT VALUES (2, 'Ostin', 'US', 'Math');
INSERT INTO STUDENT VALUES (1, 'Andy', 'US', 'Math');
INSERT INTO STUDENT VALUES (5, 'Bob', 'UK', 'Math');
INSERT INTO STUDENT VALUES (4, 'Greg', 'PL', 'Math');


В конечном итоге должно вернуть такие строки:
1 Andy US Math
4 Greg PL Math
5 Bob UK Math

подозреваю, что проще некуда - придется разбираться
select min(id) id,
       min(name) keep (dense_rank first order by id) name,
       nationality, 
       dirrection
from student
group by nationality, dirrection
order by 1

полная версия с датой, если под старшей датой подразумевалась та, что раньше и если id уникален
select  
  min(id) keep (dense_rank first order by dt) id,
  min(name) keep (dense_rank first order by dt, id) name,
  nationality, 
  dirrection,
  min(dt) dt
from student
group by nationality, dirrection
order by 5
fetch first 10 row only
30 окт 15, 02:01    [18346892]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
Alhymik
Member

Откуда:
Сообщений: 126
или на крайняк да, row_number
select *
from (select s.*, 
             row_number() over (partition by nationality, dirrection order by dt) as rn
      from student s)
where rn = 1
order by dt
fetch first 10 row only 
30 окт 15, 03:14    [18346912]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
Dzib
Member

Откуда:
Сообщений: 24
автор
select min(id) id,
min(name) keep (dense_rank first order by id) name,
nationality,
dirrection
from student
group by nationality, dirrection
order by 1


Эта кверя у меня сработала, но не совсем так как надо.
У меня 11g оракл.
Не знаю почему но когда добавляю fetch first 10 row only пишет:
автор
Error at Command Line : 8 Column : 1
Error report -
SQL Error: ORA-00933: SQL command not properly ended
00933. 00000 - "SQL command not properly ended"


Так же и с другими кверями где fetch first 10 row only
30 окт 15, 12:27    [18348223]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
Alhymik
Member

Откуда:
Сообщений: 126
Dzib
Так же и с другими кверями где fetch first 10 row only

Это фишка из 12-го оракла. Тогда роунум.
select * 
from (select min(id) id,
             min(name) keep (dense_rank first order by id) name,
             nationality, 
             dirrection
      from student
      group by nationality, dirrection
      order by 1
)
where rownum <= 2
30 окт 15, 12:48    [18348340]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
Dzib
Member

Откуда:
Сообщений: 24
Спасибо большое,
к сожелению я не понимаю как работает ключевое слово keep даже почитав документацию.

Я от себя написал вот такую кверю:

SELECT * 
FROM  (SELECT * 
       FROM   STUDENT 
       WHERE  ID IN (SELECT ID 
                     FROM   (SELECT MIN(ID) id, 
                                    NATIONALITY, 
                                    DIRRECTION 
                             FROM   STUDENT
                             GROUP  BY NATIONALITY, 
                                       DIRRECTION)) 
       ORDER  BY 1) 
WHERE  ROWNUM <= 3 


На сколько она плохая?
30 окт 15, 13:19    [18348552]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
bishnike
Member

Откуда: ст.Зеленчукская
Сообщений: 372
Dzib,

вспомнилась юморина про даму с кошелкой :)

"Женщина открыла сумочку, достала кошелочку, закрыла сумочку, открыла кошелочку, достала кошелек, закрыла кошелочку, открыла сумочку, положила туда кошелочку, закрыла сумочку, открыла кошелек положила туда билет, закрыла кошелек, открыла сумочку, достала кошелочку, закрыла сумочку, открыла кошелочку, положила туда кошелек, закрыла кошелочку, открыла сумочку, положила туда кошелочку, закрыла сумочку."
30 окт 15, 13:30    [18348648]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
Alhymik
Member

Откуда:
Сообщений: 126
Гыы )

Dzib, если ты все таки решил убить кащея, есть путь покороче
SELECT *
FROM (SELECT * 
      FROM STUDENT 
      WHERE ID IN (SELECT MIN(ID) ID
                   FROM STUDENT
                   GROUP BY NATIONALITY, 
                            DIRRECTION)
      ORDER BY ID)
WHERE  ROWNUM <= 3 
30 окт 15, 15:25    [18349452]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
Dzib
Member

Откуда:
Сообщений: 24
Мега круто) Мега спасибо)
30 окт 15, 16:14    [18349786]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
Dzib
Member

Откуда:
Сообщений: 24
Может мы б скайпами обменялись)
30 окт 15, 16:16    [18349793]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
bishnike
Member

Откуда: ст.Зеленчукская
Сообщений: 372
Одному мне кажется что изначальная постановка была другой?

Хорошо что таблица student, а не какая-нибудь типа prod.credit_dm.client :D
30 окт 15, 17:10    [18350152]     Ответить | Цитировать Сообщить модератору
 Re: групповая выборка по нескольким полям  [new]
hardhouse
Member

Откуда:
Сообщений: 51
нет, не кажется
задача сначала была одна, а потом совершенно другая:)
30 окт 15, 18:06    [18350408]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить