powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Получить строку таблицы где 1 значение максимально
25 сообщений из 43, страница 1 из 2
Получить строку таблицы где 1 значение максимально
    #40019600
Aybo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую
Надо в 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
Получить строку таблицы где 1 значение максимально
    #40019607
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aybo
insert * в любом случае быдлокод
...
Рейтинг: 0 / 0
Получить строку таблицы где 1 значение максимально
    #40019625
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Получить строку таблицы где 1 значение максимально
    #40019891
Aybo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

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

Значит и еще проще задача - запихать через select into одну такую максимальную строку по конкретному name в переменную all_source%rowtype нельзя?
Только pl/sql цикл с сортировкой и exit?
...
Рейтинг: 0 / 0
Получить строку таблицы где 1 значение максимально
    #40020037
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Получить строку таблицы где 1 значение максимально
    #40020054
Aybo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага работает, спс
...
Рейтинг: 0 / 0
Получить строку таблицы где 1 значение максимально
    #40026430
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Получить строку таблицы где 1 значение максимально
    #40026436
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неофит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
Получить строку таблицы где 1 значение максимально
    #40026441
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Дополнительно вычитать вьюху со сложным порядком соединений и посчитать агрегат, лишь бы звёздочку в запросе написать? Да уж, лихой вы танцор, что тут говорить.
...
Рейтинг: 0 / 0
Получить строку таблицы где 1 значение максимально
    #40026449
Фотография 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
Получить строку таблицы где 1 значение максимально
    #40026453
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Получить строку таблицы где 1 значение максимально
    #40026455
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL,

Tom
...
Рейтинг: 0 / 0
Получить строку таблицы где 1 значение максимально
    #40026464
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Получить строку таблицы где 1 значение максимально
    #40026466
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

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


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

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

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


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

Tom


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

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

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

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

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

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


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

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

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

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

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

22245573

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

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

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

22245573

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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