Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получить строку таблицы где 1 значение максимально / 25 сообщений из 43, страница 1 из 2
17.11.2020, 17:49
    #40019600
Aybo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
Приветствую
Надо в 11й версии вставить в копию таблицы всю строку где в одном из столбцов значение максимально.
Аналогичная - скопировать только последние строки исходников, например уже есть таблица:

Код: plsql
1.
create table s_copy as select * from all_source where 0=1



Насколько я знаю более менее быстро работает такой запрос

Код: plsql
1.
2.
3.
4.
insert into s_copy
select * from
(select a.*, row_number() over(partition by a.owner, a.name order by a.line desc) rn from all_source a)
where rn = 1



но инсерт ругается что лишний столбец rn

Поэтому вопрос нельзя ли избежать явного перечисления многочисленных столбцов или более долгого запроса?

Или insert * в любом случае быдлокод)
...
Рейтинг: 0 / 0
17.11.2020, 17:58
    #40019607
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
Aybo
insert * в любом случае быдлокод
...
Рейтинг: 0 / 0
17.11.2020, 18:43
    #40019625
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
Aybo,

если очень хочется,

select * from all_source a
order by max(id) over(partition by a.owner, a.name) -a.id

в первых

(select count(*) from all_source a group by a.owner, a.name)

строчках будет содержать нужные строчки.
...
Рейтинг: 0 / 0
18.11.2020, 12:50
    #40019891
Aybo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
НеофитSQL,

Это как-то сложно.

Значит и еще проще задача - запихать через select into одну такую максимальную строку по конкретному name в переменную all_source%rowtype нельзя?
Только pl/sql цикл с сортировкой и exit?
...
Рейтинг: 0 / 0
18.11.2020, 16:59
    #40020037
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
Aybo
Приветствую
Надо в 11й версии вставить в копию таблицы всю строку где в одном из столбцов значение максимально.


Код: plsql
1.
2.
insert into s_copy
select * from (select * from t by col desc) where rownum<2


авторАналогичная - скопировать только последние строки исходников, например уже есть таблица:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  1  insert into emp3 select * from emp
  2*   where rowid in (select max(rowid) KEEP (DENSE_RANK first ORDER BY sal DESC) from emp e2 group by deptno)
SQL> /

3 rows created.

SQL> select * from emp3;

     EMPNO ENAME      JOB              MGR HIREDATE          SAL       COMM     DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
      7698 BLAKE      MANAGER         7839 01.05.1981       2850                    30
      7839 KING       PRESIDENT            17.11.1981       5000                    10
      7902 FORD       ANALYST         7566 03.12.1981       3000                    20

SQL>



.....
stax
...
Рейтинг: 0 / 0
18.11.2020, 17:44
    #40020054
Aybo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
Ага работает, спс
...
Рейтинг: 0 / 0
10.12.2020, 15:52
    #40026430
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
Aybo
НеофитSQL,

Это как-то сложно.

Значит и еще проще задача - запихать через select into одну такую максимальную строку по конкретному name в переменную all_source%rowtype нельзя?
Только pl/sql цикл с сортировкой и exit?


Не так уж сложно:

Код: plsql
1.
2.
3.
4.
5.
select * from (
  select * from all_source а
   order by row_number() over (partition by a.owner, a.name order by a.line desc)
) where rownum <= (select count(*) from (select null from all_source c group by c.owner, c.name))
 



В отличие от решения предложенного Stax (которое мне нравится),
этот также работает на представлениях и других result sets, у которых отсутствует rowid.
...
Рейтинг: 0 / 0
10.12.2020, 16:07
    #40026436
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
НеофитSQL
этот также работает на представлениях и других result sets, у которых отсутствует rowid.

Грустно: ...бывают же извращенцы...

В догонку к причинам, по которым не следует заниматься универсализмом на insert (для закрытого топика):
env
Колонки не менял. Кажется, оно сломалось.

Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
-- Неофит запилил красоту:
create table emp(deptno, sal)
as select mod(rownum,3), rownum from dual connect by level < 10;
Table created

create table emp_copy as select * from emp where 1=0;
Table created

insert into emp_copy
select * from emp
 where rowid in (select max(rowid) KEEP (DENSE_RANK first ORDER BY sal DESC) from emp e2 group by deptno)
 ;
3 rows inserted

-- Через год пришли новые бизнес-требования

alter table emp add(FINE number default 0);
Table altered

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

-- Там еще были вопросы по поддержке, и общая картина операций на копии была такая:

alter table emp_copy modify( --не буду учить плохому
Table altered

alter table emp_copy add(FINE number default 0);
Table altered

alter table emp_copy modify(--не буду учить плохому
Table altered

-- и - ура - Универсальный Красивый Процесс заработал

insert into emp_copy
select * from emp
 where rowid in (select max(rowid) KEEP (DENSE_RANK first ORDER BY sal DESC) from emp e2 group by deptno)
;
 
3 rows inserted


-- А потом пришла пора считать зарплату и Неофита  стали бить:

select * from emp_copy
;
 
    DEPTNO       FINE        SAL
---------- ---------- ----------
         1          0          7
         2          0          8
         0          0          9
         1          7          0
         2          8          0
         0          9          0
 
6 rows selected
 
SQL> 



Мораль: никогда не делайте insert без перечисления атрибутов.
Особенно легко обмануться на широких таблицах, но и на узких бывают нежданчики.
...
Рейтинг: 0 / 0
10.12.2020, 16:23
    #40026441
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
НеофитSQL,

Дополнительно вычитать вьюху со сложным порядком соединений и посчитать агрегат, лишь бы звёздочку в запросе написать? Да уж, лихой вы танцор, что тут говорить.
...
Рейтинг: 0 / 0
10.12.2020, 16:35
    #40026449
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
И это... Неофит, даже несмотря на ставшую уже традиционной бредовость подхода все еще есть что поковырять:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select count(max(1)) from all_source c group by c.owner, c.name;

select count(count(*)) from all_source c group by c.owner, c.name;

или даже 

select count(unique c.owner||chr(0)||c.name) from all_source c;
...
Рейтинг: 0 / 0
10.12.2020, 16:46
    #40026453
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
Stax

авторАналогичная - скопировать только последние строки исходников, например уже есть таблица:

Код: plsql
1.
2.
3.
  1  insert into emp3 select * from emp
  2*   where rowid in (select max(rowid) KEEP (DENSE_RANK first ORDER BY sal DESC) from emp e2 group by deptno)
SQL> /



.....
stax

Stax, я правильно понимаю, что если в исходных данных присутствует уникальный ключ, то его можно использовать вместо rowid, а если этот ключ с индексом, то и скорость будет сравнимая?
...
Рейтинг: 0 / 0
10.12.2020, 16:49
    #40026455
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
НеофитSQL,

Tom
...
Рейтинг: 0 / 0
10.12.2020, 17:01
    #40026464
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
andrey_anonymous
И это... Неофит, даже несмотря на ставшую уже традиционной бредовость подхода все еще есть что поковырять:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select count(max(1)) from all_source c group by c.owner, c.name;

select count(count(*)) from all_source c group by c.owner, c.name;

или даже 

select count(unique c.owner||chr(0)||c.name) from all_source c;



Первые две лучше и короче, спасибо.
Насчет последней сомнения в производительности по сравнению с первыми двумя.
...
Рейтинг: 0 / 0
10.12.2020, 17:05
    #40026466
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
НеофитSQL

Stax, я правильно понимаю, что если в исходных данных присутствует уникальный ключ, то его можно использовать вместо rowid, а если этот ключ с индексом, то и скорость будет сравнимая?


имхо,
по rowid быстрее

но по ключу тоже быстро, сравнимо

зы
в древних версиях rowid менялся в редких случаях ...


.....
stax
...
Рейтинг: 0 / 0
10.12.2020, 17:06
    #40026468
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
123йй
НеофитSQL,

Tom


Спасибо, это обсуждалось здесь ранее. Аксакалы вроде решили что rowid безопасен внутри запроса. 22228830
...
Рейтинг: 0 / 0
10.12.2020, 17:25
    #40026475
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
НеофитSQL
Первые две лучше и короче, спасибо.
Насчет последней сомнения в производительности по сравнению с первыми двумя.

Традиционно не осознаете разницы между текстом написанным и программой исполненной.
Впрочем, это всё вторично.
Вы вот это разобрали внимательно?
22245618
...
Рейтинг: 0 / 0
10.12.2020, 17:30
    #40026477
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
НеофитSQL,

Ещё раз. Любой инструмент имеет смысл использовать по назначению.

Для разовых батчевых операций над одной физической таблицей в ad-hoc режиме, когда человек полностью понимает, что он делает - rowid выгоден.
Для быстрого точечного обновления/удаления одной записи в коде/приложении - rowid можно использовать (и зачастую у компонент для работы с данными есть такая настройка).

В качестве универсального решения для общего случая - недетерминировано, несопровождаемо, убивает идемпотентность на корню. Это не говоря уж о том, что мало применимо к вьюхам и имеет массу других ограничений по использованию.
...
Рейтинг: 0 / 0
10.12.2020, 17:34
    #40026478
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
andrey_anonymous
НеофитSQL
Первые две лучше и короче, спасибо.
Насчет последней сомнения в производительности по сравнению с первыми двумя.

Традиционно не осознаете разницы между текстом написанным и программой исполненной.
Впрочем, это всё вторично.
Вы вот это разобрали внимательно?
22245618


Я посмотрел раньше. Насчет insert я согласен, поэтому не прокомментировал.
Меня интересовал запрос в формате всей строки по другим причинам, для чтения.

Решение с PK/UK вместо rowid меня вполне устраивает, а для многих ситуаций где у result set нет ключа,
я могу сделать так, как показал ранее : отфильтровать по критерию, и отсчитать строки по числу групп.

Еще Анна Щукина в недавней теме показала как можно сделать "with ties", если кому интересно.
...
Рейтинг: 0 / 0
10.12.2020, 17:40
    #40026482
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
НеофитSQL,

Aybo "мешала" колонка rn, Вам она чем мешает?

.....
stax
...
Рейтинг: 0 / 0
10.12.2020, 18:10
    #40026490
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
Stax,

22245573

Лень ему, просто лень. Поэтому будет городить монструозные небезопасные конструкции, лишь бы поля не писать.
...
Рейтинг: 0 / 0
10.12.2020, 18:14
    #40026493
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
env,

вот современные интернет-ресурсы в правилах оговаривают бан
за написание текстов , разжигающих ненависть.

Похоже, корпоративные правила написания текстов запросов полностью игнорируют эту тему.
Счастливый следующий все сломает по своему.
...
Рейтинг: 0 / 0
10.12.2020, 18:23
    #40026498
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
env
Stax,

22245573

Лень ему, просто лень. Поэтому будет городить монструозные небезопасные конструкции, лишь бы поля не писать.


в перечислении, тоже есть минус

синхронно поменяли структуры источника и приемника, а в copy не поправили, ничего не слетает, зато и не сохраняет

пока боком не вылезет, работает ведь

* слетит, сразу заметят

.....
stax
...
Рейтинг: 0 / 0
10.12.2020, 18:35
    #40026505
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
Stax,

Про звёздочку Андрей уже хорошо показал, к чему может привести.

Stax
синхронно поменяли структуры источника и приемника,

Если при изменении структур не проверяются dependency, то это мягко говоря печально.

А если добавляемые поля not null, то упадёт обязательно.

От ошибки с порядком однотипных/конвертируемых полей по факту не спасёт ни *, ни перечисление. Разве что динамически каждый раз по словарю генерить список с проверкой наличия полей.
...
Рейтинг: 0 / 0
10.12.2020, 18:37
    #40026507
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
Stax,

ну, andrey_anonymous намекал на замену последовательности полей.
Представь, что это view - там это много более вероятно.
Если переставленные поля совместимы по типу - так и будут мусор в данных получать годами.
"Заметят" случайно, после ареста счетов налоговой инспекцией.
...
Рейтинг: 0 / 0
10.12.2020, 18:41
    #40026511
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить строку таблицы где 1 значение максимально
env
Stax,
Про звёздочку Андрей уже хорошо показал, к чему может привести.

многое от задачи зависит

тихо работает, но неполно (неправильно), может быть болезненей чем разовый слет

тем более после правки структур (ограничений)

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


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