Oracle SQL запрос с Группой по Не работает - PullRequest
0 голосов
/ 21 февраля 2019

Пожалуйста, помогите мне получить список до 4-х заказов (ID заказа, TagID, Имя, Дата размещения и DeliveryDate) из каждой группы Tag_ID, используя SQL-запрос Oracle PL для приведенной ниже таблицы

Order_ID  Order_Name  Tag_ID  Order_Placed_Date   Order_Delivery_Date
101       PEN         011243  02/14/2019          02/18/2019
302       PEN         011243  01/17/2019          01/20/2019
202       Eraser      011348  01/09/2019          02/12/2019
388       Eraser      011348  02/18/2019          02/20/2019
213       PEN         011243  01/19/2019          02/28/2019
291       Pencil      025489  01/11/2019          01/17/2019
450       PEN         011243  02/04/2019          02/08/2019
376       Pencil      025489  01/11/2019          01/17/2019
225       PEN         011243  02/02/2019          02/03/2019
326       Eraser      011348  02/10/2019          02/12/2019
119       Eraser      011348  02/05/2019          02/07/2019
300       PEN         011243  02/04/2019          02/08/2019
137       Eraser      011348  02/05/2019          02/07/2019
022       Pencil      025489  12/29/2018          12/31/2018
131       Pencil      025489  01/07/2019          01/08/2019
319       Pencil      025489  01/01/2019          01/03/2019
280       PEN         011243  02/04/2019          02/08/2019
127       Eraser      011348  02/05/2019          02/07/2019
161       Pencil      025489  01/02/2019          01/10/2019
241       Pencil      025489  01/11/2019          01/17/2019

Я пытался с приведенным ниже запросом, но получаю ошибку: ORA-00979: не выражение GROUP BY:

Select Order_ID, Order_Name,Tag_ID,Order_Placed_Date, Order_Delivery_Date 
from Table1 
where rownnum <=4 
group by Tag_ID order by Tag_ID 

1 Ответ

0 голосов
/ 21 февраля 2019

Используйте Общее табличное выражение / Факторинг подзапроса и Аналитическая функция Oracle для разделения результатов вместо GROUP BY.Затем выполните фильтрацию по order_row <= 4:

with cte_order_detail as
(
    Select
    t.Order_ID,
    t.Order_Name,
    t.Tag_ID,
    t.Order_Placed_Date,
    t.Order_Delivery_Date,
    row_number() over (partition by t.Tag_ID order by t.Order_ID) as order_row
    from Table1 t
)
select
od.Order_ID,
od.Order_Name,
od.Tag_ID,
od.Order_Placed_Date,
od.Order_Delivery_Date
from cte_order_detail od
where od.order_row <= 4
order by od.Tag_ID,
         od.Order_ID;

Вывод:

| ORDER_ID | ORDER_NAME | TAG_ID |    ORDER_PLACED_DATE |  ORDER_DELIVERY_DATE |
|----------|------------|--------|----------------------|----------------------|
|      101 |        PEN |  11243 | 2019-02-14T00:00:00Z | 2019-02-18T00:00:00Z |
|      213 |        PEN |  11243 | 2019-01-19T00:00:00Z | 2019-02-28T00:00:00Z |
|      225 |        PEN |  11243 | 2019-02-02T00:00:00Z | 2019-02-03T00:00:00Z |
|      280 |        PEN |  11243 | 2019-02-04T00:00:00Z | 2019-02-08T00:00:00Z |
|      119 |     Eraser |  11348 | 2019-02-05T00:00:00Z | 2019-02-07T00:00:00Z |
|      127 |     Eraser |  11348 | 2019-02-05T00:00:00Z | 2019-02-07T00:00:00Z |
|      137 |     Eraser |  11348 | 2019-02-05T00:00:00Z | 2019-02-07T00:00:00Z |
|      202 |     Eraser |  11348 | 2019-01-09T00:00:00Z | 2019-02-12T00:00:00Z |
|       22 |     Pencil |  25489 | 2018-12-29T00:00:00Z | 2018-12-31T00:00:00Z |
|      131 |     Pencil |  25489 | 2019-01-07T00:00:00Z | 2019-01-08T00:00:00Z |
|      161 |     Pencil |  25489 | 2019-01-02T00:00:00Z | 2019-01-10T00:00:00Z |
|      241 |     Pencil |  25489 | 2019-01-11T00:00:00Z | 2019-01-17T00:00:00Z |

Пример SQL Fiddle

...