Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Второе место / 25 сообщений из 30, страница 1 из 2
25.11.2020, 07:51
    #40021932
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
Всем привет!

Ломаю голову как корректно написать запрос выдающий второе место из сортированного списка для Оракла 11g.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with fifa2018raw(placed,country) as (
  select 3, 'Belgium' from dual union all
  select 1, 'France' from dual union all
  select 2, 'Russia' from dual union all
  select 4, 'England' from dual
),
fifa2018sorted(country) as (
  select country from fifa2018raw order by paced
)



fifa2018sorted выдает список победителей по порядку (1 место, второе, и т.д.), но без ключа сортировки. Доступ к сырым данным считается административно заблокирован.

Показать первое место, легко:
select * from fifa2018sorted where rownum=1

Показать второе место, сложнее:

(select * from fifa2018sorted where rownum<=2)
minus
(select * from fifa2018sorted where rownum=1)

Показать первые три места, в правильном порядке - ещё больше мороки, приходится воссоздавать ключ:

Код: plsql
1.
2.
3.
4.
5.
select country from 
  (select rownum as ord, country 
     from fifa2018sorted
    where rownum <= 3)
 order by ord



Есть ли проще методы для работы с сортированными представлениями, и разрешены ли такие представления в каком-нибудь из стандартов SQL?
...
Рейтинг: 0 / 0
25.11.2020, 09:11
    #40021951
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with fifa as (
  select date '2018-02-01' ord, 'Belgium' country from dual union all
  select date '2019-03-01', 'France' from dual union all
  select date '2021-06-01', 'Russia' from dual union all
  select date '2017-01-01', 'England' from dual
)
select country from (
  select country, row_number() over (order by ord desc) rn
    from fifa
) where rn = 3;



методы для работы с сортированными представлениями

Услышите вы, как обычно, раза с двадцатого. Ну да вода камень точит.

Не нужна вам сортировка в представлениях.
...
Рейтинг: 0 / 0
25.11.2020, 09:57
    #40021967
Vlad074
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
Изврат конечно:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with fifa2018raw(placed,country) as (
  select 3, 'Belgium' from dual union all
  select 1, 'France' from dual union all
  select 2, 'Russia' from dual union all
  select 4, 'England' from dual
)
select
  DISTINCT
  NTH_VALUE(country, 2) OVER (order by placed RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS second_place
 from fifa2018raw F
...
Рейтинг: 0 / 0
25.11.2020, 10:47
    #40021990
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
НеофитSQL
Доступ к сырым данным считается административно заблокирован.

Если ключ сортировки недоступен, но по постановке требуется его наличие, то идите к административному ресурсу и требуйте изменения контракта доступного вам представления.

Во всём остальном задача не имеет смысла.
...
Рейтинг: 0 / 0
25.11.2020, 17:32
    #40022139
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
dmdmdm


Не нужна вам сортировка в представлениях.


Не нужна, и я этим не пользуюсь. Сортированные представления плохо задокументированы и не стандартизованы.

Это не означает что у меня нет вопросов о любопытных особенностях Оракла. Мне нравится изучать плохо задокументированые аспекты систем которые выпирают из общей модели.
...
Рейтинг: 0 / 0
25.11.2020, 17:37
    #40022143
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
env

Во всём остальном задача не имеет смысла.


Это эквивалент "распечатайте третью строчку файла".
Если таблица - внешняя.

Вас не тревожит что у тюринг-полного языка SQL которым вы владеете нет простого способа решить задачу уровня первого курса?
...
Рейтинг: 0 / 0
25.11.2020, 17:53
    #40022152
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
НеофитSQL
Это эквивалент "распечатайте третью строчку файла"

Это показатель непонимания концепций. Осильте уже их.

Нет, это не эквивалент. У кучи нет третьей строчки.
...
Рейтинг: 0 / 0
25.11.2020, 17:56
    #40022153
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
НеофитSQL
нет простого способа решить задачу уровня первого курса

Добавьте себе в эту задачу:

При этом файл читается с N разных мест и строки выдаются в произвольном порядке поступления от источников. Иногда, порядок будет совпадать. На вход повлиять нельзя. Вот вам распечатка файла с одного из источников - проверять будем по ней.

А теперь решайте.
...
Рейтинг: 0 / 0
25.11.2020, 17:59
    #40022154
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
НеофитSQL
Вас не тревожит что у тюринг-полного языка SQL которым вы владеете нет простого способа решить задачу уровня первого курса?

Опять смешались в кучу кони, люди и залпы тысячи орудий ...
...
Рейтинг: 0 / 0
25.11.2020, 18:46
    #40022171
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
НеофитSQL
у тюринг-полного языка SQL

Ну-ну...
...
Рейтинг: 0 / 0
25.11.2020, 19:09
    #40022187
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
НеофитSQL
env

Во всём остальном задача не имеет смысла.


Это эквивалент "распечатайте третью строчку файла".

строки в файле идут в строго определенном порядке,
в куче нет

напр
выбрать второй камень из горки в 100камней
какой будет вторым?


ps
развлекаетесь под солнышком?
....
stax
...
Рейтинг: 0 / 0
25.11.2020, 21:55
    #40022239
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
Stax,
то, что ты сказал, его ещё больше запутает.

Конечно, SQL имеет дело с кучами (heaps), но реляционная модель - только с множествами (sets).
Поэтому для некоторых куч и реляционных отношений ответ окажется одинаковым, то есть построенном на теории вероятности над конечными совокупностями множествами.

Но, в то время как существуют кучи, для которых ответ детерминирован в положительном смысле
(например, когда вся куча состоит из одинаковых элементов, то второй выбранный из ... будет точно такой же, как первый, либо его не существует),
то для множеств он всегда детерминирован в отрицательном - можно гарантировать только то, что второй
выбранный из ... элемент будет гарантированно не такой же, как первый (либо его не существует).

ps
выбранный из ... - подразумевается, с извлечением...
...
Рейтинг: 0 / 0
25.11.2020, 22:10
    #40022247
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
booby
то для множеств он всегда детерминирован в отрицательном - можно гарантировать только то, что второй
выбранный из ... элемент будет гарантированно не такой же, как первый (либо его не существует).

На этот предмет есть какая то теорема или определение?
...
Рейтинг: 0 / 0
25.11.2020, 22:20
    #40022252
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
Stax

строки в файле идут в строго определенном порядке,
в куче нет

напр
выбрать второй камень из горки в 100камней
какой будет вторым?


ps
развлекаетесь под солнышком?
....
stax


Строки выбираемые из отсортированного множества идут в строгом порядке, поэтому работает.

Код: plsql
1.
select * from fifa2018sorted where rownum=1



Поскольку оракл уважает в этой конструкции внутреннюю сортировку, я заключил что присутствует элемент поддержки упорядоченных множеств.

Т.е. не куча камней, а сшитая тетрадка без нумерации страниц. И в некоторых случаях оракл умеет с ней работать как с тетрадкой, и гарантирует тетрадную поддержку в особых случаях.

П.с сижу в предпраздничном трафике
...
Рейтинг: 0 / 0
25.11.2020, 22:22
    #40022253
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
graycode,

есть определение множества.

После выбора с извлечением любого "первого" элемента, теоретически невозможно извлечь из оставшихся никакой - ни второй, ни любой последующий, такой же, каков оказался первый.
И никакой из извлеченных не окажется таким же, как любой предшествующий или любой последующий.

Это можно считать следствием определения, но можно считать и определяющим правилом выбора.
Если оно выполнилось, значит то, из чего производился выбор, может быть признано за множество во всех подходящих для множества контекстах.
...
Рейтинг: 0 / 0
25.11.2020, 22:23
    #40022254
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
[quot НеофитSQL#22238576]
Stax

...

Строки выбираемые из отсортированного множества...
...


Это химера вашего сознания, следствие недостатка образования.
...
Рейтинг: 0 / 0
25.11.2020, 22:33
    #40022258
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
booby
есть определение множества.

После выбора с извлечением любого "первого" элемента, теоретически невозможно извлечь из оставшихся никакой - ни второй, ни любой последующий, такой же, каков оказался первый.
И никакой из извлеченных не окажется таким же, как любой предшествующий или любой последующий.

В общем определении такого граничного условия нет, где вы взяли это определение?
...
Рейтинг: 0 / 0
25.11.2020, 22:35
    #40022259
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
booby
НеофитSQL

Строки выбираемые из отсортированного множества...
....

Это химера вашего сознания, следствие недостатка образования.


Внимательно прочитайте код:

Код: plsql
1.
select * from (select * from TBL t order by t.id) where rownum=1



И подумайте почему сортировка работает в подзапросе, хотя по вашим словам не должна.
...
Рейтинг: 0 / 0
25.11.2020, 22:37
    #40022261
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
НеофитSQL
Поскольку оракл уважает в этой конструкции внутреннюю сортировку

Это ты у Оракла так и спросил - внутреннюю сортировку уважаешь? А то смотри у меня ...))
...
Рейтинг: 0 / 0
25.11.2020, 22:39
    #40022262
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
graycode,

вторая часть ответа состоит в том, что эта задача о выборе второго шара
при выборе шаров из урны с извлечением.
Она решается для любого конкретного состава шаров.
Там что-то про условную вероятность и суммирование - не помню.
...
Рейтинг: 0 / 0
25.11.2020, 22:44
    #40022265
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
НеофитSQL
Внимательно прочитайте код:

Код: plsql
1.
select * from (select * from TBL t order by t.id) where rownum=1



И подумайте почему сортировка работает в подзапросе, хотя по вашим словам не должна.

Этот код работает, потому что когда то это был единственный способ получить набор строк пронумерованный в порядке сортировки и этот способ документирован, но подзапрос и представление это разные вещи и с представлением таких гарантий не дается, т.е. ты пользуешься недокументированным поведением, которое может измениться в зависимости от условий или параметров не сильно коррелирующих на первый взгляд с твоим кодом.
...
Рейтинг: 0 / 0
25.11.2020, 22:47
    #40022267
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
booby
вторая часть ответа состоит в том, что эта задача о выборе второго шара
при выборе шаров из урны с извлечением.
Она решается для любого конкретного состава шаров.
Там что-то про условную вероятность и суммирование - не помню.

Это уже какое то специальное множество с наложенными ограничениями, при этом такая задача решается даже при условии одинаковости шаров, главное чтобы их было конечное количество, тогда вы сможете извлечь из урны все шары.
...
Рейтинг: 0 / 0
25.11.2020, 22:50
    #40022269
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
Я вижу что определение "упорядоченного множества" может быть незнакомо для тех кто узнал о теории множеств только из учебника SQL.

Формальное: https://dic.academic.ru/dic.nsf/ruwiki/1157218

Неформальное: стопка. Стопку можно превратить в кучку (неупорядоченное множество). Все операции для кучек также работают для стопок, т.к. стопка является частным случаем кучки.
Для стопок существуют операции, сохраняющее свойство стопок ("перевернуть"), у которых может не быть аналогов для кучек. А могут быть (слить/merge).
...
Рейтинг: 0 / 0
25.11.2020, 22:54
    #40022272
graycode
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
НеофитSQL,

Про упорядоченное никто не говорил и у тебя нет упорядоченного множества, чего ты никак понять не хочешь.
...
Рейтинг: 0 / 0
25.11.2020, 22:57
    #40022273
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Второе место
graycode,

Вэлкам бэк.


> подзапрос и представление это разные вещи

Синтаксически, да.

Вы же не хотите сказать, что подзапрос и представление не эквивалентны с точки зрения оракла?


Не торопитесь.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Второе место / 25 сообщений из 30, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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