SQL-запрос для группы по

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть значения таблицы, как показано ниже,

 seqno,bill_no,bill_seq,first_name,last_name,phone_number,inserted date
1   11  1   KUTH    MUT1    96290   11-OCT-16
2   12  2   KUTH    MUT1    2   11-OCT-16
3   13  3   KUTH    MUT1    3   11-OCT-16
4   14  4   KUTH    MUT1    4   11-OCT-16
5   15  5   KUTH    MUT1    5   11-OCT-16
6   16  6   KUTH    MUT1    6   13-OCT-16
7   17  7   KUTH    MUT1    96290   13-OCT-16
8   18  8   KUTH    MUT1    8   13-OCT-16
9   19  9   KUTH    MUT1    9   13-OCT-16
10  20  10  KUTH    MUT1    96290   13-OCT-16
  

ожидаемый результат:

  1. на основе номера телефона он должен группироваться
  2. он должен сортировать на основе комбинации min seq_number и группы телефонных номеров.
  3. Старые строки даты всегда идут первыми, например, строка seqno 1 вставляется 11 октября, а 7 и 10 вставляются 13 октября, но результат начинается с минимального seqno и старой даты для группы телефонов, а для seqno 2 следует искать любую новую строку даты, номер телефона которой соответствуетили нет, если не соответствует последовательности 2 .. это будет продолжаться и для других строк.
 1   11  1   KUTH    MUT1    96290   11-OCT-16
7   17  7   KUTH    MUT1    96290   13-OCT-16
10  20  10  KUTH    MUT1    96290   13-OCT-16
2   12  2   KUTH    MUT1    2   11-OCT-16
3   13  3   KUTH    MUT1    3   11-OCT-16
4   14  4   KUTH    MUT1    4   11-OCT-16
5   15  5   KUTH    MUT1    5   11-OCT-16
6   16  6   KUTH    MUT1    6   13-OCT-16
8   18  8   KUTH    MUT1    8   13-OCT-16
9   19  9   KUTH    MUT1    9   13-OCT-16
  

Ответ №1:

 SELECT seqno,bill_no,bill_seq,first_name,last_name,phone_number,inserted date
FROM (
  SELECT seqno,bill_no,bill_seq,first_name,last_name,phone_number,inserted date
    , ROW_NUMBER () OVER (PARTITION BY phone_number ORDER BY seqno) AS rank
  FROM table)
ORDER BY phone_number,rank
  

Ответ №2:

Вы хотите сначала упорядочить всю строку по минимальному значению seq_number в каждой группе телефонных номеров, а затем по inserted_date в каждой группе?

Тогда, я думаю, это сделает это:

ВЫБЕРИТЕ seqno,bill_no,bill_seq,first_name,last_name,phone_number,inserted_date ИЗ ( ВЫБЕРИТЕ seqno,bill_no,bill_seq,first_name,last_name,phone_seq,inserted_date , MIN (seqno) ПОВЕРХ (РАЗДЕЛ ПО номеру телефона) КАК минимум ИЗ таблицы1) X ПОРЯДОК ПО минимуму, inserted_date

Ответ №3:

Хотя не совсем ясно, ищете ли вы 2 запроса или 1, но я думаю, что это то, что вы ищете:

 select 
    seqno, bill_no, bill_seq, first_name, last_name, phone_number, inserted date 
from 
    table
group by
    phone_number, seqno, bill_no, bill_seq, first_name, last_name, inserted date
order by 
    phone_number, seqno asc
  

Комментарии:

1. Я ожидаю одного запроса. На самом деле данные вставляются каждый день с новым порядковым номером. Идея здесь в том, что нужно вставить в первую строку какую-то старую дату с номером телефона, и если новая строка даты имеет ту же строку, то она должна быть рядом со старой строкой даты.

2. Я думаю, что предлагаемый запрос делает это.