Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка верхних строк с определенной суммой столбца / 10 сообщений из 10, страница 1 из 1
13.01.2017, 19:11
    #39384477
Lynxovat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка верхних строк с определенной суммой столбца
Есть таблица
Id Quantity1 502 1003 504 205 606 207 100
где Id 1 - самая новая запись, Id 7 - старая.
Нужно выбрать верхние строки с общей суммой столбца "Quantity" не менее 250, то есть ожидаемый результат:
Id Quantity1 502 1003 504 205 60
Сам пока дошел только до такого:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT *
  FROM (
    SELECT SUM(Quantity) OVER(ORDER BY Id ASC) AS S, a.*
    FROM my_table a
  )
WHERE S < 250


В результате получаю меньше, чем нужно, на 1 строку:
Id Quantity1 502 1003 504 20
Заранее спасибо!
...
Рейтинг: 0 / 0
13.01.2017, 19:25
    #39384485
Bad The John Boy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка верхних строк с определенной суммой столбца
Код: plsql
1.
(order by Id ASC rows between unbounded preceding and 1 preceding) 
...
Рейтинг: 0 / 0
13.01.2017, 21:30
    #39384567
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка верхних строк с определенной суммой столбца
Bad The John Boy
Код: plsql
1.
(order by Id ASC rows between unbounded preceding and 1 preceding) 



Ну и про NULL не забываем.

SY.
...
Рейтинг: 0 / 0
16.01.2017, 15:47
    #39385529
Lynxovat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка верхних строк с определенной суммой столбца
Bad The John Boy,

Спасибо, то, что нужно.

Но исходная задача немного изменилась. Допустим, в исходном сферическом примере Id могут повторяться:
Id Quantity1 501 1002 503 203 603 204 1004 105 50
В конечной выборке нужны все строки с тем Id, когда сумма Quantity становится 250+, то есть:
Id Quantity1 501 1002 503 203 603 20
Логично, что нужно просто в
Код: plsql
1.
(order by Id ASC rows between unbounded preceding and 1 preceding) 


использовать range вместо rows, но с range не допускается использовать выражения типа "and 1 preceding". Как быть?
...
Рейтинг: 0 / 0
16.01.2017, 16:19
    #39385565
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка верхних строк с определенной суммой столбца
Lynxovatс range не допускается использовать выражения типа "and 1 preceding"субд не попутал?
...
Рейтинг: 0 / 0
16.01.2017, 16:41
    #39385589
Lynxovat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка верхних строк с определенной суммой столбца
-2-Lynxovatс range не допускается использовать выражения типа "and 1 preceding"субд не попутал?
Да вроде нет:
Oracle Database 11g Release 11.2.0.3.0 - 64bit Production
Так то, в принципе он не ругается, но и не работает, как ожидается - не добавляет весь range, хотя с rows всё прокатывает.
...
Рейтинг: 0 / 0
16.01.2017, 17:05
    #39385611
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка верхних строк с определенной суммой столбца
LynxovatТак то, в принципе он не ругается, но и не работает, как ожидается - не добавляет весь range, хотя с rows всё прокатывает.

Все он показывает:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
SQL> with t as (
  2             select  id,
  3                     quantity,
  4                     nvl(sum(quantity) over(order by id range between unbounded preceding and 1 preceding),0) q
  5               from  tbl
  6            )
  7  select  id,
  8          quantity
  9    from  t
 10    where q < 250
 11  /

        ID   QUANTITY
---------- ----------
         1         50
         1        100
         2         50
         3         20
         3         60
         3         20

6 rows selected.

SQL>



SY.
...
Рейтинг: 0 / 0
16.01.2017, 17:21
    #39385623
Lynxovat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка верхних строк с определенной суммой столбца
SY,

Спасибо! Внимательно посмотрел ваш пример и добавил
Код: sql
1.
nvl(...),0)


Всё заработало. Видимо, это и имелось ввиду под "Ну и про NULL не забываем."
...
Рейтинг: 0 / 0
16.01.2017, 17:46
    #39385655
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка верхних строк с определенной суммой столбца
LynxovatВсё заработало. Видимо, это и имелось ввиду под "Ну и про NULL не забываем."

Т.е. ты хочешь сказать что с ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING бeз NVL pаботало ?
Помедитируй что вернет пeрвый ROW/RANGE при 1 PRECEDING.

SY.
...
Рейтинг: 0 / 0
16.01.2017, 17:58
    #39385665
Lynxovat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка верхних строк с определенной суммой столбца
SYLynxovatВсё заработало. Видимо, это и имелось ввиду под "Ну и про NULL не забываем."

Т.е. ты хочешь сказать что с ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING бeз NVL pаботало ?
Помедитируй что вернет пeрвый ROW/RANGE при 1 PRECEDING.

SY.
Хм, без nvl теряет первый row/range, всё остальное исправно выводит. Да, сложно назвать это "работало".
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка верхних строк с определенной суммой столбца / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]