powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопросы на собеседовании
149 сообщений из 149, показаны все 6 страниц
Вопросы на собеседовании
    #39758985
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Знает кто ответ? Можете пояснить ?

1.
Первый вопросКакой тип должен быть установлен вместо вопроса, чтобы метод работал корректно?
Код: java
1.
2.
3.
4.
public boolean simpleMethod(? a ){

return a+1==a;
} 



2.
УсловиеЕсть две таблицы Table1(Продукты) Table2(Магазины) тип многие ко многим.

вопросКакой максимально возможный набор вариантов сущностей может существовать при таком отношении?

3. В таблице есть дубликаты:
Table
id | name | surname
--------------------
1 | Ivan | surname
2 | Ivan | surname
3 | Petr | surname
4 | Petr | surname
5 | Borya | surname


Напишите запрос удаляющий дубликаты, что бы получилось:
Table
id | name | surname
--------------------
1 | Ivan | surname
3 | Petr | surname
5 | Borya | surname


Нашел ответ:
Код: sql
1.
2.
DELETE FROM table
WHERE id NOT IN (SELECT max(id) FROM table GROUP BY name HAVING count(id)>1)



Но я его не понимаю, можете объяснить на пальцах как он работает ?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39758989
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
public boolean simpleMethod(? a){
        return a + 1 == a;
    }



Тут закинута целая лопата навоза на турбину.

Во первых тип может быть любой из алгебраических (byte, short, int, long). Пожалуй кроме вещественных.
Во вторых результат - тождественно FALSE потому что для известных арифметик a + 1 == a дает отсутствие истины.
В третьих формат названия метода simpleMethod() ну... не прошел-бы code-review. Будут это спрашивать или нет ХЗ.
Но я-бы добавил к ответу.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39758990
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВо вторых результат - тождественно FALSE потому что для известных арифметик a + 1 == a дает отсутствие истины

Тогда возникает вопрос для чего это метод нужен ? И зачем о нем вести речь на собеседовании если результат FALSE ?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39758992
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.HofmannУсловиеЕсть две таблицы Table1(Продукты) Table2(Магазины) тип многие ко многим.

вопросКакой максимально возможный набор вариантов сущностей может существовать при таком отношении?

Декартово произведение двух таблиц как раз даёт нам прямоугольник (матрицу)
уникальных комбинаций. И count - вернет количество.

Для Oracle SQL вот такой компактный вариант. Для ANSI SQL там возможно надо добавить JOIN.

Код: plsql
1.
SQL> SELET count(*) FROM Table1, Table2);
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39758993
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.HofmannавторВо вторых результат - тождественно FALSE потому что для известных арифметик a + 1 == a дает отсутствие истины

Тогда возникает вопрос для чего это метод нужен ? И зачем о нем вести речь на собеседовании если результат FALSE ?
Я думаю что в этот вопрос заложены смыслы на разных уровнях. Как в Библию.
И в зависимости от того кому задан этот вопрос - можно получить ответы разных детализаций.
Как задачка про червяка который грызёт две книги.

Она решаема за 1 минуту для школьника и нерешаема для академика. Просто разные уровни восприятия.

На мой субъективный взгляд это легкий троллинг.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39758995
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. на первый взгляд любые числовые, плюс стринга. может ругнется на что. суть вопроса видимо, соберется ли вообще или нет. верно?
2. непонятен вопрос. очевидно, Продукт, Магазин, ПродуктМагазин. третий не обязателен.
3. работает как дистинкт но только по имени
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39758996
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDr.Hofmannпропущено...


пропущено...


Декартово произведение двух таблиц как раз даёт нам прямоугольник (матрицу)
уникальных комбинаций. И count - вернет количество.

Для Oracle SQL вот такой компактный вариант. Для ANSI SQL там возможно надо добавить JOIN.

Код: plsql
1.
SQL> SELET count(*) FROM Table1, Table2);


а мне показалось если речь о сущностях то говорят об орме. хотя в некоторых вопросах на собеседованиях искать смысл это как с черной кошкой которой нет не было никогда и не будет у этих людей.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39758997
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, Я ответил так же как оба ваших поста - но к сожалению было сказано, что это не правильные ответы, на вопрос почему авторы оставили за собой право не давать никаких комментариев.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39758998
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDr.Hofmannпропущено...

Тогда возникает вопрос для чего это метод нужен ? И зачем о нем вести речь на собеседовании если результат FALSE ?
Я думаю что в этот вопрос заложены смыслы на разных уровнях. Как в Библию.
И в зависимости от того кому задан этот вопрос - можно получить ответы разных детализаций.
Как задачка про червяка который грызёт две книги.

Она решаема за 1 минуту для школьника и нерешаема для академика. Просто разные уровни восприятия.

На мой субъективный взгляд это легкий троллинг.

как тебе такой код:
Код: java
1.
2.
3.
4.
void revert(boolean o)
if(o==true){
 o=false
}
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39758999
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он не имеет эффекта.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759000
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.Hofmannmayton, Я ответил так же как оба ваших поста - но к сожалению было сказано, что это не правильные ответы, на вопрос почему авторы оставили за собой право не давать никаких комментариев.
надо было настоять на озвучке их версии ответа и подискутировать. если отказываются - то проявить агрессию и назвать их тупыми неучами с которыми тебе не по пути и громко хлопнуть дверью.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759001
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.Hofmannmayton, Я ответил так же как оба ваших поста - но к сожалению было сказано, что это не правильные ответы, на вопрос почему авторы оставили за собой право не давать никаких комментариев.
Знакомая ситуация. Я лет 10 назад делал тестовые задания. Сейчас не делаю никогда. Именно по этой причине.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759002
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОн не имеет эффекта.
и смысла
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759003
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTDr.Hofmannmayton, Я ответил так же как оба ваших поста - но к сожалению было сказано, что это не правильные ответы, на вопрос почему авторы оставили за собой право не давать никаких комментариев.
надо было настоять на озвучке их версии ответа и подискутировать. если отказываются - то проявить агрессию и назвать их тупыми неучами с которыми тебе не по пути и громко хлопнуть дверью.
(пожимая плечами)

А что это изменит? Лучше как можно быстрее разпрощайтесь и идите на следующий собес в другую контору.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759005
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDr.Hofmannmayton, Я ответил так же как оба ваших поста - но к сожалению было сказано, что это не правильные ответы, на вопрос почему авторы оставили за собой право не давать никаких комментариев.
Знакомая ситуация. Я лет 10 назад делал тестовые задания. Сейчас не делаю никогда. Именно по этой причине.
а я делаю если они в рамках часа-двух. недавно вот изменил себе и взялся за задание которое объективно с хорошей проработкой заняло бы неделю. я забил и применил много упрощений. потратил наверное один день. челам это не понравилось. всё на собеседовании спрашивали почему не применил то не написал то обложил только десятком тестов. снова наступил на грабли. больше не буду. выходной день который я на это похерил очень жалко до сих пор. даже комментов не дали почему и что им не понравилось. так из интонации понял что они восприняли мой код как небрежный с малым уделением времени к деталям.

не делайте тз никогда. поговорили и хватит.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759006
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как называется контора?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759007
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonandreykaTпропущено...

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

А что это изменит? Лучше как можно быстрее разпрощайтесь и идите на следующий собес в другую контору.
ну как зачем. выброс эмоций продлевает жизнь и делает человека счастливее ))
у меня товарищ так на собеседовании (не экстремально) и распрощался. сказал просто парни короче я всё понял давайте пока ищите кого-нибудь другого. это когда он спросил тестируете ли вы свой код а они сказали мы его пишем сразу без ошибок
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759008
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTmaytonпропущено...

(пожимая плечами)

А что это изменит? Лучше как можно быстрее разпрощайтесь и идите на следующий собес в другую контору.
ну как зачем. выброс эмоций продлевает жизнь и делает человека счастливее ))
у меня товарищ так на собеседовании (не экстремально) и распрощался. сказал просто парни короче я всё понял давайте пока ищите кого-нибудь другого. это когда он спросил тестируете ли вы свой код а они сказали мы его пишем сразу без ошибок
Надо просто иметь какой-то заряд иронии. Не знаю будет-ли интересно.
Есть украинский сайт йоб аное ойти https://ebanoe.it/ здесь полно всяких забавных историй.
Почитаешь ... и вроде как у тебя не всё так уж плохо
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759010
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторнадо было настоять на озвучке их версии ответа и подискутировать. если отказываются - то проявить агрессию и назвать их тупыми неучами с которыми тебе не по пути и громко хлопнуть дверью.
Обычно агрессию проявляю если есть латентный пи...др который пытается до тебя докопаться или быдло который считает себя супергероем, в том контексте и ситуации таких людей не было)))

Контора инфосистемы джет по первому вопросу
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759013
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.Hofmannавторнадо было настоять на озвучке их версии ответа и подискутировать. если отказываются - то проявить агрессию и назвать их тупыми неучами с которыми тебе не по пути и громко хлопнуть дверью.
Обычно агрессию проявляю если есть латентный пи...др который пытается до тебя докопаться или быдло который считает себя супергероем, в том контексте и ситуации таких людей не было)))

Контора инфосистемы джет по первому вопросу
Если это Skype-Call - просто положите трубку. Любые другие действия могут потенциально вас
внести в black-list для рекрутинга. Там проставят галочку - матершинник и неадекват а потом
сложно будет вобщем... Быть Платовым уёво.. и Адамовским тоже не сахар.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759015
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
справедливое замечание. но если ты не через РК то ... ну да всё равно лучше сдержаннее быть. земля то квадратная.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759019
RonibGreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсть украинский сайт йоб аное ойти https://ebanoe.it/ здесь полно всяких забавных историй.

Насколько я знаю в том региноне украинцев нет. Зато есть много выходцев из Украины/Израиля. ;)
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759024
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RonibGreat, ну ты содержание сайта читал?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759030
RonibGreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonRonibGreat, ну ты содержание сайта читал?
Просмотрел... даже пару статей попробовал найти на других источниках, типа гугля, яндекса, кьюквикк, яху но не нашел. Вывыд: статьи высосаны из яйца. Дальше много контента с картинками, которые соответствуют тому чот проишодит в Калифорнии и никакого отношеия к другим регионам мира о которых пушут в статьях нет. Человек, сочняющий статьи явно пишт из Калифорнии, собственно о том что он видит вокруг себя. Тут и ка равину ходить не надо - простое наблюдение.

Я знаю русский, украинский хорошо и украинский/р(г)усский язык, культуру Украины - обороты речи в статьях далеко от Украины, то есть человек за этим сайтом на Украине не жил. Судя по однотипной плоскости статей - пишет один человек. Видимо у него хобби такое либо с головой не так - каждый приспосабливается в этом мире.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759031
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RonibGreatmaytonRonibGreat, ну ты содержание сайта читал?
Просмотрел... даже пару статей попробовал найти на других источниках, типа гугля, яндекса, кьюквикк, яху но не нашел. Вывыд: статьи высосаны из яйца. Дальше много контента с картинками, которые соответствуют тому чот проишодит в Калифорнии и никакого отношеия к другим регионам мира о которых пушут в статьях нет. Человек, сочняющий статьи явно пишт из Калифорнии, собственно о том что он видит вокруг себя. Тут и ка равину ходить не надо - простое наблюдение.

Я знаю русский, украинский хорошо и украинский/р(г)усский язык, культуру Украины - обороты речи в статьях далеко от Украины, то есть человек за этим сайтом на Украине не жил. Судя по однотипной плоскости статей - пишет один человек. Видимо у него хобби такое либо с головой не так - каждый приспосабливается в этом мире.
Это - развлекательный сайт. По крайней мере если ты читал дисклеймер внизу то там пишут.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759033
RonibGreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Это надо быть с "хорошим" диагнозом чтобы так развлекаться. Хотя в Калифорнии все остальные равлечения стоят дорого. ;)
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759035
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При чем тут вообще Калифорния?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759039
RonibGreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Имел ввиду в Южных Штатах. Хотя не исключено что чел живет имено в Калифорнии. Клаудера офис вроде как бы в Калифорнии (Сан-Франциско), где сайт хостится.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759040
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще перпендикулярно где хостится.

Ладно давай проедем эту тему. Ты просто выброси конспирологические теории.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759041
RonibGreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Да мне собственно пофиг. Я сейчас делаю отчетност по налогам за прошлый год, и так между прочим заглядываю на скл.ру.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759112
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Вопрос для обсуждения. И первый мой вопрос был бы - что значит корректно?
На первый взгляд кажется, что любые целые числа и char.

2. Как бе похоже на декартово произведение



3.

Код: sql
1.
2.
DELETE FROM table
WHERE id NOT IN (SELECT max(id) FROM table GROUP BY name HAVING count(id)>1)



Какая-то фигня, а не запрос. NOT - лишний.


Код: sql
1.
2.
DELETE FROM table
WHERE id IN (SELECT max(id) FROM table GROUP BY name HAVING count(id)>1)



Это отработает для данной постановки, но лучше, конечно, добавить и фамилию в группировку, а то как-то совсем криво:

Код: sql
1.
2.
DELETE FROM table
WHERE id IN (SELECT max(id) FROM table GROUP BY name, surname HAVING count(id)>1)
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759114
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин1.что значит корректно?

Значит возвращать TRUE и FALSE а не только false как уже здесь обсуждалось.


Озверин2. Это отработает для данной постановки, но лучше, конечно, добавить и фамилию в группировку, а то как-то совсем криво:

Как это сделать можете написать? у меня просто идей нет.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759115
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.Hofmann,

так я и написал запрос с фамилией, самый нижний.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759117
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.Hofmann, насчет true или false - ну тогда double.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759118
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот обитель зла https://jet.su/
Историю ведет с 93 года.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759119
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинDr.Hofmann, насчет true или false - ну тогда double.

можете еще и float - где там бесконечности еще есть?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759121
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравнение с Nan и c Inf тоже будет давать false.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759122
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСравнение с Nan и c Inf тоже будет давать false.

вопрос был про тип. Если тип будет , допустим, double, то можно не только бесконечно передавать, но и обычное вещественное число. Вот и будет true или false.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759123
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинmaytonСравнение с Nan и c Inf тоже будет давать false.

вопрос был про тип. Если тип будет , допустим, double, то можно не только бесконечно передавать, но и обычное вещественное число. Вот и будет true или false.
Беря во внимание общие правила сравнения вещественных чисел (через == не сравнивают).
Я-бы сказал что здесь очень маловероятно.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759125
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинDr.Hofmann,

так я и написал запрос с фамилией, самый нижний.
Я тупо не врубаюсь зачем вычислять максимальный id группировать по имени по фамилии, можно как-то по подробней этот момент объяснить:
Код: sql
1.
SELECT max(id) FROM table GROUP BY name, surname HAVING count(id)>1
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759126
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОзверинпропущено...


вопрос был про тип. Если тип будет , допустим, double, то можно не только бесконечно передавать, но и обычное вещественное число. Вот и будет true или false.
Беря во внимание общие правила сравнения вещественных чисел (через == не сравнивают).
Я-бы сказал что здесь очень маловероятно.

ну мне скахали, что надо true или false - мол так корректно.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759127
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.HofmannОзверинDr.Hofmann,

так я и написал запрос с фамилией, самый нижний.
Я тупо не врубаюсь зачем вычислять максимальный id группировать по имени по фамилии, можно как-то по подробней этот момент объяснить:
Код: sql
1.
SELECT max(id) FROM table GROUP BY name, surname HAVING count(id)>1




ну если посмотреть на то, что было и как стало, то удалили дубликаты с max id

Допустим, был 1-ivan, 2-ivan. Остался 1-ivan. Тоже самое Petr. HAVING count(*)>1 отсеет записи, у которых нет дублпикатов.

Насчет, почему по имени и фамилии, да потому, что а вдруг имена будут совпадать в другой таблице, а фамилии - различаться?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759128
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинDr.Hofmannпропущено...

Я тупо не врубаюсь зачем вычислять максимальный id группировать по имени по фамилии, можно как-то по подробней этот момент объяснить:
Код: sql
1.
SELECT max(id) FROM table GROUP BY name, surname HAVING count(id)>1




ну если посмотреть на то, что было и как стало, то удалили дубликаты с max id

Допустим, был 1-ivan, 2-ivan. Остался 1-ivan. Тоже самое Petr. HAVING count(*)>1 отсеет записи, у которых нет дублпикатов.

Насчет, почему по имени и фамилии, да потому, что а вдруг имена будут совпадать в другой таблице, а фамилии - различаться?

А ну все правильно, у меня почему-то отложилось что дубликаты с одинаковыми id должны быть, поэтому понятно какой из них максимальный.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759129
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.HofmannОзверин1.что значит корректно?

Значит возвращать TRUE и FALSE а не только false как уже здесь обсуждалось.

не ну если так загоняться то может речь о рейскандишене? а==а+1 это ж наверняка не атомарная.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759132
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинDr.Hofmann, насчет true или false - ну тогда double.
вот ведь срань я попробовал максинт и максбайт а максдабл не попробовал
вопрос из разряда как получить отрицательное значение из Math.abs
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759133
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл написать вопрос:
авторВ памяти храняться 5 объектов которые сиквентально ссылаются друг на друга, попадут ли эти объекты под очистку в JVM gabrage коллектором, если не будет связи ссылки с одним из главных объектов в хипе?

Мой ответ был да, это правильно?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759134
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо такое знать это либо столкнуться с каким нибудь гамнокодом где прошло переполнение и найти багу, либо загоняться пазлерами.
вопрос из разряда "сам вчера узнал".
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759135
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.HofmannЗабыл написать вопрос:
авторВ памяти храняться 5 объектов которые сиквентально ссылаются друг на друга, попадут ли эти объекты под очистку в JVM gabrage коллектором, если не будет связи ссылки с одним из главных объектов в хипе?

Мой ответ был да, это правильно?
джиси рут если есть то не попадут. если нет то умрут.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759140
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.HofmannЗабыл написать вопрос:
авторВ памяти храняться 5 объектов которые сиквентально ссылаются друг на друга, попадут ли эти объекты под очистку в JVM gabrage коллектором, если не будет связи ссылки с одним из главных объектов в хипе?

Мой ответ был да, это правильно?

я полез гуглить слово сиквентально. а что значит главный объект?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759141
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинDr.HofmannЗабыл написать вопрос:
пропущено...

Мой ответ был да, это правильно?

я полез гуглить слово сиквентально. а что значит главный объект?
очередной вышибон )) последовательно сказать видать религия не позволяет они наверное ходят сугубо на ланчи и дринкают смузи.
речь о gc root https://stackoverflow.com/questions/27186799/what-are-gc-roots-for-classes
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759142
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне вот интересно почему Integer.MAX_VALUE+1 не равно Integer.MAX_VALUE а Double.MAX_VALUE+1 равно Double.MAX_VALUE? чо за гон.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759144
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинDr.HofmannЗабыл написать вопрос:
пропущено...

Мой ответ был да, это правильно?

я полез гуглить слово сиквентально. а что значит главный объект?

Код: java
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.
Object someLink = new A();

class A{
B b;
public A(){
b = new B();
}

class B{
C c;
public B(){
c = new C();
}

class C{
D d;
public C(){
d = new D();
}

.....
.....

.....

Object someLink = null;
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759145
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTОзверинпропущено...


я полез гуглить слово сиквентально. а что значит главный объект?
очередной вышибон )) последовательно сказать видать религия не позволяет они наверное ходят сугубо на ланчи и дринкают смузи.
речь о gc root https://stackoverflow.com/questions/27186799/what-are-gc-roots-for-classes

вопрос не имеет смысла, потому что этих 5 гипотетических объектов могут располагаться в разных сегментах хипа и собственно быть этими самыми рутами. Потому я все еще слово сиквентально.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759146
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не думаю что там кто то глубоко копал еще и придумали какой то главный объект. что за такой главный объект и насколько он главный. самый главный или не очень главный? ))
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759148
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTне думаю что там кто то глубоко копал еще и придумали какой то главный объект. что за такой главный объект и насколько он главный. самый главный или не очень главный? ))
Извиняюсь не главный а рутовый объект А - будет рутовый ссылка someLink ссылается на него.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759149
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTмне вот интересно почему Integer.MAX_VALUE+1 не равно Integer.MAX_VALUE а Double.MAX_VALUE+1 равно Double.MAX_VALUE? чо за гон.
Double внутри имеет структуру научной формы записи. И для очень больших double добавление
Единички не оказывает влияния на мантиссу.. Это как к диаметру вселенной добавить ещё сантиметр.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759151
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какие тонкости. т.е. где есть Е там плюс один дает ничего а где нет там оно оборачивается. какие оригиналы те кто делал жвм.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759152
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.HofmannОзверинпропущено...


я полез гуглить слово сиквентально. а что значит главный объект?

Код: java
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.
Object someLink = new A();

class A{
B b;
public A(){
b = new B();
}

class B{
C c;
public B(){
c = new C();
}

class C{
D d;
public C(){
d = new D();
}

.....
.....

.....

Object someLink = null;



интересно, где такие вопросы спрашивают? Уже озвучивали?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759153
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTкакие тонкости. т.е. где есть Е там плюс один дает ничего а где нет там оно оборачивается. какие оригиналы те кто делал жвм.

математика - бессердечная ты с**а. Бесконечность+1 = Бесконечность.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759154
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте не вводить англицизмы.

Приводите оригинал. Без интерпретаций.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759155
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинandreykaTкакие тонкости. т.е. где есть Е там плюс один дает ничего а где нет там оно оборачивается. какие оригиналы те кто делал жвм.

математика - бессердечная ты с**а. Бесконечность+1 = Бесконечность.
да но дабл то конечен. вот бигдец уже куда ни шло. а дабл не канает. максдабл логически ничем не отличается от максинта.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759156
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTОзверинпропущено...


математика - бессердечная ты с**а. Бесконечность+1 = Бесконечность.
да но дабл то конечен. вот бигдец уже куда ни шло. а дабл не канает. максдабл логически ничем не отличается от максинта.

У дабла есть обозначение положительной бесконечности и отрицательной. И это не максдабл - это именно бесконечность.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759157
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у дабла есть максимальное число. оно есть. оно известно. оно никуда не делось и оно конечно выше него число не получить. у бигинта нету.

а тут прям игрища как со скоростью света и теорией относительности
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759159
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насчет бесконечности.. если ты сделаешь бесконечность минус один ты вещественного числа не получишь. если ты "бесконечное число дабл" минус 1 сделаешь ты его получишь. следовательно максдабл != бесконечность.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759160
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинвопрос не имеет смысла, потому что этих 5 гипотетических объектов могут располагаться в разных сегментах хипа и собственно быть этими самыми рутами. Потому я все еще слово сиквентально.
Можно рассмотреть два варианта? Когда они хранятся либо в Young или в Old generation.

Дополнительное уточнение к знатокам, ссылки на объекты разве в хипе храняться или Permanent generation ? или Non-heap Meta space?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759161
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с джавы восемь вообще нет никакого пермгена. да и не хранятся (хранились) там никогда объекты которые ты создаешь в приложении. там чот с классами и их метадатой связано.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759162
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сорян, не объекты разумеется, а ссылки на них. а то ща заклюют )
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759163
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или не. Объекты. )) Короче я спать
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759164
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTсорян, не объекты разумеется, а ссылки на них. а то ща заклюют )
кроме статических переменных и статических ссылок которые хранятся в метаспейсе?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759193
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинandreykaTкакие тонкости. т.е. где есть Е там плюс один дает ничего а где нет там оно оборачивается. какие оригиналы те кто делал жвм.

математика - бессердечная ты с**а. Бесконечность+1 = Бесконечность.
А можно ещё сравнивать бесконечности.

И окажется что одни из них больше других.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759498
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
Озверин2. Как бе похоже на декартово произведение
Нет, не похоже.
Если принять, что речь шла не об ORM-сущностях, а о комбинациях данных, то декартово произведение для 1 магазина (S) и 3 продуктов (a,b,c) даст 1*3=3, в то время как комбинаций там больше — Sa, Sb, Sc, Sab, Sac, Sbc, Sabc. Т.е. сумма сочетаний из n по k=1…n, что равно N=2**n - 1.
Это для одного магазина. Конкретный вариант для каждого магазина можно воспринимать как число в N-ричной системе счисления, тогда количество комбинаций «много ко многим» будет равно N**число_магазинов

Итого для n товаров и m магазинов получаем (2**n - 1)**m. Т.е. овердофига, а вовсе не декартово произведение. Если учитывать вариант «магазин без товаров», то -1 из скобочек убираем.


ОзверинЭто отработает для данной постановки, но лучше, конечно, добавить и фамилию в группировку, а то как-то совсем криво:
Код: sql
1.
2.
DELETE FROM table
WHERE id IN (SELECT max(id) FROM table GROUP BY name, surname HAVING count(id)>1)


«Это отработает для данной постановки» — факт, отработает. А вот если дубликатов будет больше одного, то уже нехорошо получится.

Код: sql
1.
2.
3.
4.
5.
6.
7.
delete from table where id in (
  select id 
  from table a 
  join (
    select min(id) as survivor, name, surname from table group by name, surname having count(*)>1
  ) b on a.name=b.name and a.surname=b.surname and a.id<>b.survivor
)


Корректную обработку null оставим топикстартеру как упражнение.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759505
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vsl,

1. может быть с набором данных это и имелось ввиду. Из постановки вообще мало что понятно.
2. Запрос составлен корректно, сколько бы дубликатов там не было. Вы как-то излишне усложнили довольно простой запрос.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759510
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vsl, насчет комбинаторики, я как бе не очень помню, но есть подозрение, что тут присутствует количество сочетаний без повторений, а это - n1(для варианта, когда n=m).
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759511
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинvsl, насчет комбинаторики, я как бе не очень помню, но есть подозрение, что тут присутствует количество сочетаний без повторений, а это - n1(для варианта, когда n=m).

n!
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759516
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинОзверинvsl, насчет комбинаторики, я как бе не очень помню, но есть подозрение, что тут присутствует количество сочетаний без повторений, а это - n1(для варианта, когда n=m).

n!

а ну нет. Комбинаторика - ваще не мое.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759517
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
Озверин2. Запрос составлен корректно, сколько бы дубликатов там не было. Вы как-то излишне усложнили довольно простой запрос.
Код: plaintext
1.
2.
3.
4.
5.
|id|name|surname|
|1 |Вася|Петров |
|2 |Вася|Петров |
|3 |Вася|Петров |
|4 |Боря|Петров |

Запрос вида
Код: sql
1.
delete from where id in (select max(id) .... having ...)

просто по определению удалит только одну строчку для каждой группы дубликатов. В моём примере будет удалена строка с id=4, и запрос придётся прогонять повторно, чтобы удалить ещё и строку с id=3.
Поэтому нужно выбирать для удаления все строки, относящиеся к дубликатам, кроме какой-то одной.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759521
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
ОзверинОзверинvsl, насчет комбинаторики, я как бе не очень помню, но есть подозрение, что тут присутствует количество сочетаний без повторений, а это - n1(для варианта, когда n=m).
n!
Нет, n! - это перестановки, а не сочетания.
Но можно даже без комбинаторики. Есть n товаров, каждый из них либо есть в магазине, либо нет => получаем двоичное число разрядностью n, что даёт 2**n значений. Минус 1, если исключать вариант «магазин без товаров».
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759523
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vslОзверин2. Запрос составлен корректно, сколько бы дубликатов там не было. Вы как-то излишне усложнили довольно простой запрос.
Код: plaintext
1.
2.
3.
4.
5.
|id|name|surname|
|1 |Вася|Петров |
|2 |Вася|Петров |
|3 |Вася|Петров |
|4 |Боря|Петров |

Запрос вида
Код: sql
1.
delete from where id in (select max(id) .... having ...)

просто по определению удалит только одну строчку для каждой группы дубликатов. В моём примере будет удалена строка с id=4, и запрос придётся прогонять повторно, чтобы удалить ещё и строку с id=3.
Поэтому нужно выбирать для удаления все строки, относящиеся к дубликатам, кроме какой-то одной.

кстати, да. Для таблиц с дубликатом записей более 2х - проблема ;(
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759557
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добралсо до дома, написал более читаемый запрос:

Код: sql
1.
2.
3.
4.
SELECT id
FROM NAMES
WHERE 
id IN(SELECT min(id) FROM NAMES GROUP BY name HAVING count(id)>1 OR count(id)=1);
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759558
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторИтого для n товаров и m магазинов получаем (2**n - 1)**m. Т.е. овердофига, а вовсе не декартово произведение. Если учитывать вариант «магазин без товаров», то -1 из скобочек убираем.
Я не въезжаю двойка откуда взялась?
Поясните пожалуйста.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759599
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
Dr.HofmannавторИтого для n товаров и m магазинов получаем (2**n - 1)**m. Т.е. овердофига, а вовсе не декартово произведение. Если учитывать вариант «магазин без товаров», то -1 из скобочек убираем.
Я не въезжаю двойка откуда взялась?
Поясните пожалуйста.

Писал дальше.
vsl Есть n товаров, каждый из них либо есть в магазине, либо нет => получаем двоичное число разрядностью n, что даёт 2**n значений. Минус 1, если исключать вариант «магазин без товаров».
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759605
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
ОзверинДобралсо до дома, написал более читаемый запрос:
«Я печатаю со скоростью 800 знаков в минуту... но такая фигня получается...»

Озверин
Код: sql
1.
2.
3.
4.
SELECT id
FROM NAMES
WHERE 
id IN(SELECT min(id) FROM NAMES GROUP BY name HAVING count(id)>1 OR count(id)=1);


select id ... where id in (select min(id) ...) - внешний select бесполезен
HAVING count(id)>1 OR count(id)=1 - не хватает только условия на зависание монетки в воздухе

Если вам так не нравится join, то можно и без него (по крайней мере, в тексте):
Код: sql
1.
2.
3.
4.
5.
delete from table where id in (
  select id from table
  minus
  select min(id) from table group by name, surname
)
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759609
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примерно так
Код: plsql
1.
2.
3.
4.
5.
6.
DELETE from table 
WHERE id in ( 
  SELECT id2 id1
  FROM (  SELECT id id2, row_number() over(partition BY tb.name, tb.surname order BY tb.id) num
                FROM table tb) allrows
  WHERE num>1) proscripted
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759634
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vslОзверинДобралсо до дома, написал более читаемый запрос:
«Я печатаю со скоростью 800 знаков в минуту... но такая фигня получается...»

Озверин
Код: sql
1.
2.
3.
4.
SELECT id
FROM NAMES
WHERE 
id IN(SELECT min(id) FROM NAMES GROUP BY name HAVING count(id)>1 OR count(id)=1);


select id ... where id in (select min(id) ...) - внешний select бесполезен
HAVING count(id)>1 OR count(id)=1 - не хватает только условия на зависание монетки в воздухе

Если вам так не нравится join, то можно и без него (по крайней мере, в тексте):
Код: sql
1.
2.
3.
4.
5.
delete from table where id in (
  select id from table
  minus
  select min(id) from table group by name, surname
)



странные у вас комментарии, просто вместо SELECT использовать DELETE - очевидно же.
Мне не нравятся join`ы по текстовым полям, да еще и по нескольким. Имею право, почему нет?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759635
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vsl, а насчет minus - ну это специфичная инструкция не из стандарта SQL.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759638
niteshade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверин,
Пожалуйста, посмотрите на запрос на удаление дубликатов в самом первом посте темы.
Он правильный. Зачем уже четвёртую страницу вы его неправильно переписываете?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759643
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niteshadeОн правильный.Нет, там еще фамилия же. Вообщем в лоб (без всяких group by, аналитических функций и пр):
Код: sql
1.
2.
3.
4.
5.
6.
7.
delete table t1
where exists (
 select * from table t2
 where t1.name=t2.name
 and t1.surname=t2.surname
 and t1.id > t2.id
)



PS. кто
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759645
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niteshadeОзверин,
Пожалуйста, посмотрите на запрос на удаление дубликатов в самом первом посте темы.
Он правильный. Зачем уже четвёртую страницу вы его неправильно переписываете?

не, он неправильный.

Можно по шагам разобрать:

Код: sql
1.
SELECT max(id) FROM table GROUP BY name HAVING count(id)>1


выбрать записи с максимальным id, если эти записи имеют более 1го дупликата по полю name

Код: sql
1.
2.
DELETE FROM table
WHERE id NOT IN(...)



удалить все остальные записи.

То есть те записи, которые НЕ дублируются, будут удалены, останутся только дубликаты с максимальным айди - все наоборот же.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759653
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
Озверинvsl, а насчет minus - ну это специфичная инструкция не из стандарта SQL.
Нет minus - будет except или ещё что-нибудь. Не будет ничего - значит, не повезло, возвращаемся к join'ам.

Вариант с exists, который предлагался ниже, тоже не из стандарта - насколько я помню, в стандарте (по крайней мере, в 92) нельзя назначать alias таблицам у delete и update.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759657
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vslОзверинvsl, а насчет minus - ну это специфичная инструкция не из стандарта SQL.
Нет minus - будет except или ещё что-нибудь. Не будет ничего - значит, не повезло, возвращаемся к join'ам.

Вариант с exists, который предлагался ниже, тоже не из стандарта - насколько я помню, в стандарте (по крайней мере, в 92) нельзя назначать alias таблицам у delete и update.

возвращайтесь к join`ам, кто ж против. Но есть варианты и без них обойтись.
стандарт ныне 2008 года, но, думаю, что в 92 все это было, правда, я не понимаю, к чему вы это говорите.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759660
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
Озверинvslselect id ... where id in (select min(id) ...) - внешний select бесполезен
HAVING count(id)>1 OR count(id)=1 - не хватает только условия на зависание монетки в воздухе


странные у вас комментарии, просто вместо SELECT использовать DELETE - очевидно же.
Мне не нравятся join`ы по текстовым полям, да еще и по нескольким. Имею право, почему нет?
Какое решение - такие и комментарии. В третий (или в какой, в четвёртый?) раз наступить на те же грабли, удаляя по одной строке из группы - это пустяк, главное ведь читаемость. Ох, погодите-ка, там же ещё было добавлено крайне полезное условие «A ИЛИ НЕ A». Читаемость на высоте, да.

Что касается join'ов по текстовым полям - ну так модель данных такая. Если бы дубликаты определялись числовыми полями - были бы join'ы по числам :)

Ладно, вот вам другое решение без join'ов:
Код: sql
1.
2.
3.
4.
5.
6.
delete from table where id in (
  select id from (
    select id, first_value(id) over (partition by name, surname order by id) as survivor from table
  ) t 
  where t.id<>t.survivor
)
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759663
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vsl, так мой последний запрос - некорректен?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759665
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vsl
Код: sql
1.
2.
3.
4.
5.
6.
delete from table where id in (
  select id from (
    select id, first_value(id) over (partition by name, surname order by id) as survivor from table
  ) t 
  where t.id<>t.survivor
)



максимально понятный запрос ;)))))
ладно, хватит меня веселить, примените свои знания и злобу лучше к своей работе.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759668
vsl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
vsl
Гость
Озверинvsl, так мой последний запрос - некорректен?
Конечно. Возможно, вы хотели написать там NOT IN, но не написали.
Код: sql
1.
delete from table where id NOT in (select min(id) from table group by name, surname)


Вот так было бы нормально.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759669
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vslОзверинvsl, так мой последний запрос - некорректен?
Конечно. Возможно, вы хотели написать там NOT IN, но не написали.
Код: sql
1.
delete from table where id NOT in (select min(id) from table group by name, surname)


Вот так было бы нормально.

Я написал выбору "правильных" кодов, если вы не обратили внимание. Переделать на DELETE - как бе вопрос не сложный ;)
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759670
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vsl, ну и то, что вы написали - неправильно ;(
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759671
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинvsl, ну и то, что вы написали - неправильно ;(

ну по крайней мере не то, что писал я. Хотя, можно и так, видимо ;)
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759681
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловniteshadeОн правильный.Нет, там еще фамилия же. Вообщем в лоб (без всяких group by, аналитических функций и пр):

Я вот уверен, что на собеседовании как раз хотят проверить знает ли претендент как раз эти самый аналитические. И другие решения в зачет просто не пойдут ибо "не знает".
Также как в первом вопросе - знает ли про потерю точности при сложении в "плавающей арифметике". Хотя сформулирована 1 задача в каком-то олимпиадном стиле.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759686
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаЯ вот уверен, что на собеседовании как раз хотят проверить знает ли претендент как раз эти самый аналитические.А какой смысл проверять знает кандидат аналитические функции (или хотябы о их существовании) или нет? На их изучение нужно от силы потратить неделю, так что их знание или незнание никак не добавляет и не умаляет ценности кандидата, а вот внимательность - это офигеть какой важный навык, который из за год не получить.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759698
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловА какой смысл проверять знает кандидат аналитические функции (или хотябы о их существовании) или нет? На их изучение нужно от силы потратить неделю, так что их знание или незнание никак не добавляет и не умаляет ценности кандидата, а вот внимательность - это офигеть какой важный навык, который из за год не получить.
А зачем тогда вообще проверять знание SQL? Его аналогично можно "изучить". Аналогично можно "за неделю изучить" множество разных вещей.
Про смысл нужно спрашивать у тех кто задания задает, я лишь пытаюсь смоделировать их цели, понять какие они критерии используют при тестировании, для конкретной узкой задачи - успешно пройти их тест (выдать им ожидаемый ответ).
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759715
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПылинкаА зачем тогда вообще проверять знание SQL? Его аналогично можно "изучить". Аналогично можно "за неделю изучить" множество разных вещей.Как это для чего? чтобы начать общаться, например, в этом топике никто так и не смог привести правильный ответ: все приведенные запросы могут как удалить "не дубликаты", так и не удалить дубликаты, просто потому, что в базу доступ обычно конкурентный.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759717
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрите. Само по себе знание SQL назубок никому не нужно. Пускай этим бравируют
ребята в топика Oracle по пятницам.

Мне кажется на собесе важно увидеть как человек рассуждает когда он видит проблему.
Какие он видит пути решения.

По сути даже если не знает как группировать - пускай нарисует цикл или алгоритм на императивном
языке. Если нарисует - значит 99% понимает. Это важно.

А зубрёжка SQL - это дело практики.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759725
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловПылинкаА зачем тогда вообще проверять знание SQL? Его аналогично можно "изучить". Аналогично можно "за неделю изучить" множество разных вещей.Как это для чего? чтобы начать общаться, например, в этом топике никто так и не смог привести правильный ответ: все приведенные запросы могут как удалить "не дубликаты", так и не удалить дубликаты, просто потому, что в базу доступ обычно конкурентный.

а какой правильный запрос может гарантированно удалить все дубликаты, которые появятся после? Я чего то не понял.
Если вы про уровень изоляции транзакции типа READ COMMITED, то это режим по умолчанию для баз, а AutoCommit нынче стоит по умочланию в большинстве реализаций jdbc драйверов.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759731
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверина какой правильный запрос может гарантированно удалить все дубликаты, которые появятся после? Я чего то не понял.Ну а "после" тут причем? вот вы в delete завязались на то, что удаляете все что не min/max, какие гарантии что в соседней сессии кто-то этот самый min/max не удалит?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759734
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловОзверина какой правильный запрос может гарантированно удалить все дубликаты, которые появятся после? Я чего то не понял.Ну а "после" тут причем? вот вы в delete завязались на то, что удаляете все что не min/max, какие гарантии что в соседней сессии кто-то этот самый min/max не удалит?

там, где having count(id)>1 - таким.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759738
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинтам, где having count(id)>1 - таким.это как? вот вы запустили свой убер-delete, в соседней сессии ваш min/max удалили, ваша транзакция этот min/max все еще видит, что получаем на выходе? удаленный "недубликат".
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759758
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловОзверинтам, где having count(id)>1 - таким.это как? вот вы запустили свой убер-delete, в соседней сессии ваш min/max удалили, ваша транзакция этот min/max все еще видит, что получаем на выходе? удаленный "недубликат".

похожее поведение будет и без аналитических функций, если кто-то не удалит, а вставит данные. А если кто то параллельно удалить ваши данные, а кто-то еще параллельно вставит их - так поведение и вовсе будет полностью аналогичным. Тут можно придумать что угодно, но это не решается на уровне запроса - это решается на уровне логики приложения или конкретной СУБД.

В общем случае - это решается блокировкой таблицы, но это также не относится к запросу, а только к реализации или логики приложению.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759815
Ilya007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так думаю лучше вот такой вопрос задать - сразу видно, что человек писал на JAVA, а не книжку прочитал:

Что не так с методом? и почему.

public boolean equalsMethod(String a){

return a.equals("String");
}
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759822
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya007,

Потенциальный NPE.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759826
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это проблема?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759834
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTэто проблема?
Это не проблема. Это просто code review point.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759886
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya007Я так думаю лучше вот такой вопрос задать - сразу видно, что человек писал на JAVA, а не книжку прочитал:
Что не так с методом? и почему.
public boolean equalsMethod(String a){
return a.equals("String");
}
Это что еще за ахтунг!!? )))
ну фиг с ним нуллПоинтерЭксепшеном) ревертнём икьюалс и избавимся от него.
Но что этот метод вообще за ерунду делает?)
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759905
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Второй поинт это Naming convention.

Название метода должно говорить о сути.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759917
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, надо его назвать иквалз и заоверрайдить
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759918
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NixicIlya007Я так думаю лучше вот такой вопрос задать - сразу видно, что человек писал на JAVA, а не книжку прочитал:
Что не так с методом? и почему.
public boolean equalsMethod(String a){
return a.equals("String");
}
Это что еще за ахтунг!!? )))
ну фиг с ним нуллПоинтерЭксепшеном) ревертнём икьюалс и избавимся от него.
Но что этот метод вообще за ерунду делает?)
нормально всё. там чуть выше вон даблы на переполнение проверяют сравниванием дабл==дабл+1
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759924
Ilya007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonIlya007,

Потенциальный NPE.

Это верный ответ.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759928
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya007,

юзай опшн
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759931
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya007Я так думаю лучше вот такой вопрос задать - сразу видно, что человек писал на JAVA, а не книжку прочитал:

Что не так с методом? и почему.

public boolean equalsMethod(String a){

return a.equals("String");
}
Правильный ответ - этот метод нах не нужен
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759954
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya007Я так думаю лучше вот такой вопрос задать - сразу видно, что человек писал на JAVA, а не книжку прочитал:

Что не так с методом? и почему.

public boolean equalsMethod(String a){

return a.equals("String");
}

А в чем прикол ? Проверки на null нету ?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759957
Ilya007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.HofmannIlya007Я так думаю лучше вот такой вопрос задать - сразу видно, что человек писал на JAVA, а не книжку прочитал:

Что не так с методом? и почему.

public boolean equalsMethod(String a){

return a.equals("String");
}

А в чем прикол ? Проверки на null нету ?

Может прийти null и тогда на методе a.equals - сломается (NPE). Нужно писать всегда так "String".equals(a);.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759967
Фотография Dr.Hofmann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya007Dr.Hofmannпропущено...


А в чем прикол ? Проверки на null нету ?

Может прийти null и тогда на методе a.equals - сломается (NPE). Нужно писать всегда так "String".equals(a);.

Это из-за типа хранения стринг пула в случае "String", где храняться строки а не объекты поэтому NPE не выбрасывается? Так ?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759983
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.HofmannIlya007пропущено...


Может прийти null и тогда на методе a.equals - сломается (NPE). Нужно писать всегда так "String".equals(a);.

Это из-за типа хранения стринг пула в случае "String", где храняться строки а не объекты поэтому NPE не выбрасывается? Так ?
Это из за того что любой вызов метода объекта предполагает что объект не пуст.
И этой проблеме - более полу-века лет. О ней писал Тони Хоар в шестидесятых.
Проблему обозвали ошибкой ценой в миллиард.

И спустя пол-века программисты продолжают писать код где эта ошибка
воспроизводится.

Или по крайней мере не доказывается ее невозможность.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759989
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilya007Dr.Hofmannпропущено...


А в чем прикол ? Проверки на null нету ?

Может прийти null и тогда на методе a.equals - сломается (NPE). Нужно писать всегда так "String".equals(a);.
не согласен.
считаю что там где ты не ожидаешь никогда увидать нпе ты не должен его хендлить.
если придет нпе и ты сделаешь так как нужно делать всегда то ты вместо нпе вообще получишь фолс который пробросится дальше и алга лови жуков в самых необычных местах.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759991
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dr.HofmannIlya007пропущено...


Может прийти null и тогда на методе a.equals - сломается (NPE). Нужно писать всегда так "String".equals(a);.

Это из-за типа хранения стринг пула в случае "String", где храняться строки а не объекты поэтому NPE не выбрасывается? Так ?
что такое тип хранения стрингпула? что за строки а не объекты? объекты это тоже строки. стрингпул это тоже объект. можно ли сравнивать стрингпул со стрингой -> нет. Уважаемый Майтон уже сказал почему.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39759992
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreykaTIlya007пропущено...


Может прийти null и тогда на методе a.equals - сломается (NPE). Нужно писать всегда так "String".equals(a);.
не согласен.
считаю что там где ты не ожидаешь никогда увидать нпе ты не должен его хендлить.
если придет нпе и ты сделаешь так как нужно делать всегда то ты вместо нпе вообще получишь фолс который пробросится дальше и алга лови жуков в самых необычных местах.
Это спор о цене последствий.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760598
niteshade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ОзверинniteshadeОзверин,
Пожалуйста, посмотрите на запрос на удаление дубликатов в самом первом посте темы.
Он правильный. Зачем уже четвёртую страницу вы его неправильно переписываете?

не, он неправильный.

Можно по шагам разобрать:

Код: sql
1.
SELECT max(id) FROM table GROUP BY name HAVING count(id)>1


выбрать записи с максимальным id, если эти записи имеют более 1го дупликата по полю name

Код: sql
1.
2.
DELETE FROM table
WHERE id NOT IN(...)


удалить все остальные записи.

То есть те записи, которые НЕ дублируются, будут удалены, останутся только дубликаты с максимальным айди - все наоборот же.
да, был невнимателен
правильный:
Код: sql
1.
2.
DELETE FROM table
WHERE id NOT IN (SELECT max(id) FROM table GROUP BY name, surname)


определение оригинала, как записи с минимальным id - это ваше домысливание
тем не менее, в такой постановке заменяем max на min
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760600
niteshade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей ПанфиловniteshadeОн правильный.Нет, там еще фамилия же. Вообщем в лоб (без всяких group by, аналитических функций и пр):
Код: sql
1.
2.
3.
4.
5.
6.
7.
delete table t1
where exists (
 select * from table t2
 where t1.name=t2.name
 and t1.surname=t2.surname
 and t1.id > t2.id
)



PS. кто
есть типовой запрос:
Код: sql
1.
2.
DELETE FROM table
WHERE id NOT IN (SELECT max(id) FROM table GROUP BY name, surname)


он просто и эффективен
зачем переписывать его в более сложной и менее эффективной форме?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760602
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niteshadeесть типовой запрос:
Код: sql
1.
2.
DELETE FROM table
WHERE id NOT IN (SELECT max(id) FROM table GROUP BY name, surname)


он просто и эффективен
зачем переписывать его в более сложной и менее эффективной форме?

Ну для начала, попробуйте найти ошибку в "типовом" запросе - она там есть и довольно существенная. Во вторых с "эффективностью" там так себе:

Код: sql
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.
SQL> DELETE task1 t1
 WHERE id NOT IN (  SELECT MAX (id)
                      FROM task1 t2
                  GROUP BY name);  2    3    4


Execution Plan
----------------------------------------------------------
Plan hash value: 1998126981

-------------------------------------------------------------------------------------------
| Id  | Operation              | Name     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT       |          |  1000K|   133M|       | 32224   (1)| 00:00:02 |
|   1 |  DELETE                | TASK1    |       |       |       |            |          |
|*  2 |   HASH JOIN RIGHT ANTI |          |  1000K|   133M|    23M| 32224   (1)| 00:00:02 |
|   3 |    VIEW                | VW_NSO_1 |   989K|    12M|       | 19252   (1)| 00:00:01 |
|   4 |     SORT GROUP BY      |          |   989K|   119M|   130M| 19252   (1)| 00:00:01 |
|   5 |      INDEX FULL SCAN   | T1_X     |  1000K|   121M|       | 19252   (1)| 00:00:01 |
|   6 |    INDEX FAST FULL SCAN| T1_X     |  1000K|   121M|       |  5219   (1)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ID"="MAX(ID)")


Statistics
----------------------------------------------------------
        135  recursive calls
        876  db block gets
      38625  consistent gets
      17248  physical reads
     333084  redo size
        867  bytes sent via SQL*Net to client
       1041  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          1  sorts (disk)



Код: sql
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.
SQL> DELETE task1 t1
 WHERE EXISTS
          (SELECT *
             FROM task1 t2
            WHERE t1.name = t2.name AND t1.id > t2.id);  2    3    4    5


Execution Plan
----------------------------------------------------------
Plan hash value: 2072444764

----------------------------------------------------------------------------------------
| Id  | Operation              | Name  | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT       |       |   506K|   122M|       | 23598   (1)| 00:00:01 |
|   1 |  DELETE                | TASK1 |       |       |       |            |          |
|*  2 |   HASH JOIN SEMI       |       |   506K|   122M|   132M| 23598   (1)| 00:00:01 |
|   3 |    INDEX FAST FULL SCAN| T1_X  |  1000K|   121M|       |  5219   (1)| 00:00:01 |
|   4 |    INDEX FAST FULL SCAN| T1_X  |  1000K|   121M|       |  5219   (1)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("T1"."NAME"="T2"."NAME")
       filter("T1"."ID">"T2"."ID")


Statistics
----------------------------------------------------------
          0  recursive calls
        805  db block gets
      38781  consistent gets
          0  physical reads
     315792  redo size
        867  bytes sent via SQL*Net to client
       1052  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760612
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niteshade, он правильный только для данного набора данных, вроде уже обсудили.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760629
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов, а почему во втором случае 0 physical reads?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760643
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
"Delete on names  (cost=1081.09..1747.03 rows=15198 width=6) (actual time=31.138..31.138 rows=0 loops=1)"
"  ->  Seq Scan on names  (cost=1081.09..1747.03 rows=15198 width=6) (actual time=26.771..30.621 rows=933 loops=1)"
"        Filter: (NOT (hashed SubPlan 1))"
"        Rows Removed by Filter: 15729"
"        SubPlan 1"
"          ->  HashAggregate  (cost=817.91..1028.45 rows=21054 width=40) (actual time=20.265..22.960 rows=15729 loops=1)"
"                ->  Seq Scan on names names_1  (cost=0.00..589.95 rows=30395 width=40) (actual time=0.004..9.098 rows=16662 loops=1)"
"Total runtime: 31.258 ms"


"Delete on names t1  (cost=681.22..3179.15 rows=5243 width=12) (actual time=38.338..38.338 rows=0 loops=1)"
"  ->  Hash Semi Join  (cost=681.22..3179.15 rows=5243 width=12) (actual time=38.337..38.337 rows=0 loops=1)"
"        Hash Cond: (((t1.f)::text = (t2.f)::text) AND ((t1.s)::text = (t2.s)::text))"
"        Join Filter: (t1.id > t2.id)"
"        Rows Removed by Join Filter: 15729"
"        ->  Seq Scan on names t1  (cost=0.00..445.29 rows=15729 width=46) (actual time=0.004..4.245 rows=15729 loops=1)"
"        ->  Hash  (cost=445.29..445.29 rows=15729 width=46) (actual time=20.473..20.473 rows=15729 loops=1)"
"              Buckets: 2048  Batches: 1  Memory Usage: 1227kB"
"              ->  Seq Scan on names t2  (cost=0.00..445.29 rows=15729 width=46) (actual time=0.002..7.740 rows=15729 loops=1)"
"Total runtime: 38.378 ms"



в моем случае разница не велика в пользу агрегирования(быстрее, чем джоины) на таблице в 15000 записей и при условии, что ни одна из них не будет удалена. В случае, если перейти на выборку по одному текстовому полю, а не по двум - результаты остаются очень похожими.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760646
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,


Код: sql
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.
-- Table: temp.names

-- DROP TABLE temp.names;

CREATE TABLE temp.names
(
  id integer NOT NULL,
  f character varying(150),
  s character varying(150),
  CONSTRAINT pk PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE temp.names
  OWNER TO postgres;

-- Index: temp.f_idx

-- DROP INDEX temp.f_idx;

CREATE INDEX f_idx
  ON temp.names
  USING btree
  (f COLLATE pg_catalog."default");

-- Index: temp.s_idx

-- DROP INDEX temp.s_idx;

CREATE INDEX s_idx
  ON temp.names
  USING btree
  (s COLLATE pg_catalog."default");

EXPLAIN ANALYZE DELETE FROM temp.names
WHERE id NOT IN (SELECT max(id) FROM temp.names GROUP BY f)

EXPLAIN ANALYZE  DELETE FROM temp.names t1
 WHERE EXISTS
          (SELECT t2.*
             FROM temp.names t2
            WHERE t1.f = t2.f AND t1.id > t2.id);
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760647
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

и вариант со сравнением по 2м полям:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
EXPLAIN ANALYZE DELETE FROM temp.names
WHERE id NOT IN (SELECT max(id) FROM temp.names GROUP BY f, s)

EXPLAIN ANALYZE  DELETE FROM temp.names t1
 WHERE EXISTS
          (SELECT t2.*
             FROM temp.names t2
            WHERE t1.f = t2.f AND t1.s = t2.s AND t1.id > t2.id);
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760653
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

и наконец, корректный вариант дает очень схожу картину мира:

EXPLAIN ANALYZE
DELETE
FROM temp.names t1
WHERE t1.id NOT IN(SELECT min(t2.id) FROM temp.names t2 GROUP BY t2.f, t2.s HAVING count(t2.id)>1 OR count(t2.id)=1);


"Delete on names t1 (cost=742.56..1127.83 rows=8331 width=6) (actual time=35.358..35.358 rows=0 loops=1)"
" -> Seq Scan on names t1 (cost=742.56..1127.83 rows=8331 width=6) (actual time=35.357..35.357 rows=0 loops=1)"
" Filter: (NOT (hashed SubPlan 1))"
" Rows Removed by Filter: 15729"
" SubPlan 1"
" -> HashAggregate (cost=551.89..715.32 rows=10895 width=40) (actual time=23.995..28.049 rows=15729 loops=1)"
" Filter: ((count(t2.id) > 1) OR (count(t2.id) = 1))"
" -> Seq Scan on names t2 (cost=0.00..343.62 rows=16662 width=40) (actual time=0.007..6.850 rows=15729 loops=1)"
"Total runtime: 35.475 ms"

Все это связано с тем, что после 1-2х запросов большинство баз создает свой какой-нить хэш-агрегат и уже работает с ним. Потому, чтобы показать РЕАЛЬНУЮ разницу между по сути очень похожими запросами, надо поработать с базой, поудалять оттуда данные, повставлять новые, повыполнять запросы на удаление, а потом уже анализировать итоги. Как и в java - надо бе разогреться.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760657
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверина почему во втором случае 0 physical reads?Потому что табличка с индексом в память легла - оракл может себе позволить, а вопрос скорее всего в том, почему в первом случае (group by) не 0, ответ тут простой: оно сортировку решило не в памяти делать, а на диске (1 sorts (disk)). В случае ваших 15 тыс. смотреть даже нечего, сделайте несколько миллионов и индекс нормальный, типа (дубликат, id).

Ну и еще доводы в пользу exists:
в случае group by возникают краевые эффекты на пустых полях: в данном случае "получится" что null=null, т.е. группируем налы, а удаляем уже по id

из-за NOT IN возникают краевые эффекты на пустых id, т.е. если в таблице есть пустой id, то запрос вообще ничего не удалит

в случае exists я могу базу бомбить несколькими запросами одновременно, просто добавив во внешнее условие name like 'A%', name like 'B%' и пр. В случае group by условие нужно добавлять уже в два места чтобы они коррелировали
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760700
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов, так если сделать 15 млн, то и не ляжет вся она в память, а только - частично. О том и разговор, что первый запрос при всей неэффективности отработал всего на 1 секунду медленее, но НА ДИСКЕ. Короче, на неразогретом оракле. В моем случае он отработал быстрее в обоих случаях.

1. это специфичное для оракла? В пг группировка по null - всегда отдельная группа и никакого сравнения просто нет.
2. пустой primary key? это уже эффект какой-то подозрительный.
3.при like уже под большим вопросом вообще использование индексов, так что делать то вы можете что угодно, но как это повлияет на план запроса - вы не знаете. Правда я вообще не понял, про что этот пункт.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760702
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин, единственное, что, для PG - not in менее эффективен в плане работы, чем exists. Потому можно на него перейти, проверить.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760733
niteshade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфиловniteshadeесть типовой запрос:
Код: sql
1.
2.
DELETE FROM table
WHERE id NOT IN (SELECT max(id) FROM table GROUP BY name, surname)


он просто и эффективен
зачем переписывать его в более сложной и менее эффективной форме?

Ну для начала, попробуйте найти ошибку в "типовом" запросе - она там есть и довольно существенная. Во вторых с "эффективностью" там так себе:

Код: sql
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.
SQL> DELETE task1 t1
 WHERE id NOT IN (  SELECT MAX (id)
                      FROM task1 t2
                  GROUP BY name);  2    3    4


Execution Plan
----------------------------------------------------------
Plan hash value: 1998126981

-------------------------------------------------------------------------------------------
| Id  | Operation              | Name     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT       |          |  1000K|   133M|       | 32224   (1)| 00:00:02 |
|   1 |  DELETE                | TASK1    |       |       |       |            |          |
|*  2 |   HASH JOIN RIGHT ANTI |          |  1000K|   133M|    23M| 32224   (1)| 00:00:02 |
|   3 |    VIEW                | VW_NSO_1 |   989K|    12M|       | 19252   (1)| 00:00:01 |
|   4 |     SORT GROUP BY      |          |   989K|   119M|   130M| 19252   (1)| 00:00:01 |
|   5 |      INDEX FULL SCAN   | T1_X     |  1000K|   121M|       | 19252   (1)| 00:00:01 |
|   6 |    INDEX FAST FULL SCAN| T1_X     |  1000K|   121M|       |  5219   (1)| 00:00:01 |
-------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("ID"="MAX(ID)")


Statistics
----------------------------------------------------------
        135  recursive calls
        876  db block gets
      38625  consistent gets
      17248  physical reads
     333084  redo size
        867  bytes sent via SQL*Net to client
       1041  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          1  sorts (disk)



Код: sql
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.
SQL> DELETE task1 t1
 WHERE EXISTS
          (SELECT *
             FROM task1 t2
            WHERE t1.name = t2.name AND t1.id > t2.id);  2    3    4    5


Execution Plan
----------------------------------------------------------
Plan hash value: 2072444764

----------------------------------------------------------------------------------------
| Id  | Operation              | Name  | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT       |       |   506K|   122M|       | 23598   (1)| 00:00:01 |
|   1 |  DELETE                | TASK1 |       |       |       |            |          |
|*  2 |   HASH JOIN SEMI       |       |   506K|   122M|   132M| 23598   (1)| 00:00:01 |
|   3 |    INDEX FAST FULL SCAN| T1_X  |  1000K|   121M|       |  5219   (1)| 00:00:01 |
|   4 |    INDEX FAST FULL SCAN| T1_X  |  1000K|   121M|       |  5219   (1)| 00:00:01 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("T1"."NAME"="T2"."NAME")
       filter("T1"."ID">"T2"."ID")


Statistics
----------------------------------------------------------
          0  recursive calls
        805  db block gets
      38781  consistent gets
          0  physical reads
     315792  redo size
        867  bytes sent via SQL*Net to client
       1052  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)


индексы откуда появились?
опять домысливания?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760741
niteshade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для Oracle всё ещё проще:
Код: sql
1.
2.
DELETE FROM table
WHERE not rowid IN (SELECT max(rowid) FROM table GROUP BY name, surname)
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760742
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озвериндля PG
для PG кстати работает еще такой запрос (не знаю, пробегал ли - не читал топик целиком)
Код: sql
1.
2.
3.
4.
DELETE   FROM table_with_dups T1
  USING       table_with_dups T2
WHERE  T1.ctid    < T2.ctid     
  AND  T1.name    = T2.name 
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760743
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niteshadeиндексы откуда появились?
опять домысливания?

не откуда, а какие - полнотекстовые какие-нибудь.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760752
niteshade
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверин,
это уже какая-то яростная дичь)
в первом сообщении топика есть условия
исходя из них необходимо решить задачу
может, хватит уже натягивать сову на глобус?))
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760756
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaОзвериндля PG
для PG кстати работает еще такой запрос (не знаю, пробегал ли - не читал топик целиком)
Код: sql
1.
2.
3.
4.
DELETE   FROM table_with_dups T1
  USING       table_with_dups T2
WHERE  T1.ctid    < T2.ctid     
  AND  T1.name    = T2.name 



я как-то с сомнением, если развернуть запрос похоже на :

Код: sql
1.
2.
DELETE FROM table_with_dups T1
WHERE T1.ctid IN(SELECT T2.ctid FROM table_with_dups T2 WHERE  T1.ctid < T2.ctid AND T1.name = T2.name)



то есть похоже, что он сделает ровно обратное. Я не прав?

p.s. в данном случае USING -специфичен для базы.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760758
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
niteshadeОзверин,
это уже какая-то яростная дичь)
в первом сообщении топика есть условия
исходя из них необходимо решить задачу
может, хватит уже натягивать сову на глобус?))

вопрос пошел немного дальше. Правильные запросы уже были. Что вам не нравится? Не хотите - не обсуждайте.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760760
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинchpashaпропущено...

для PG кстати работает еще такой запрос (не знаю, пробегал ли - не читал топик целиком)
Код: sql
1.
2.
3.
4.
DELETE   FROM table_with_dups T1
  USING       table_with_dups T2
WHERE  T1.ctid    < T2.ctid     
  AND  T1.name    = T2.name 



я как-то с сомнением, если развернуть запрос похоже на :

Код: sql
1.
2.
DELETE FROM table_with_dups T1
WHERE T1.ctid IN(SELECT T2.ctid FROM table_with_dups T2 WHERE  T1.ctid < T2.ctid AND T1.name = T2.name)



то есть похоже, что он сделает ровно обратное. Я не прав?

p.s. в данном случае USING -специфичен для базы.

а не, вроде все ок.
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760919
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Execution plan будем смотреть?

Потому-что для некоторых dbms существует т.н. аналитические функции которые тоже
позволяют решать данную задачу.

Вообще - удаление дубликатов - это страшный боян и в профильных топиках уже на это
не отвечают а просто кидают тебя в Stackoverflow или в какой-то ФАК.

И зачем мы это мурыжым?
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39760940
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я ждал выступления начальника транспортного цеха и вади...
...
Рейтинг: 0 / 0
Вопросы на собеседовании
    #39761015
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверинтак если сделать 15 млн, то и не ляжет вся она в память, а только - частично.Ну а какая разница-то? С group by появляется дополнительная операция, как ни крути, она чего-то да и стоит, а изначальный пойнт был в том, что exists - ну это вообще супер сложно и неэффективно, пока автору сего утверждения правоту доказать не удалось.

Озверин1. это специфичное для оракла? В пг группировка по null - всегда отдельная группа и никакого сравнения просто нетну вот есть таблица

idname1null2null
в результате group by с max(id) она превратится в:

idname2null
в итоге delete удалит первую запись, вопрос: это ожидаемое поведение с т.з. постановки задачи или нет? Т.е. когда мы говорим про дубликаты, null = null или нет (когда мы в контексте СУБД, то там все null разные)?

Озверин2. пустой primary key? это уже эффект какой-то подозрительный.ну это вы по названию колонки домыслили уже, а без DDL таблицы что там в действительности - неизвестно.

Озверин3.при like уже под большим вопросом вообще использование индексов, так что делать то вы можете что угодно, но как это повлияет на план запроса - вы не знаете. Правда я вообще не понял, про что этот пункт.ну вот у вас есть PostgreSQL, который не умеет parallel а в базе триллион записей, вопрос: как ускорить удаление?

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

0. Изначальный поинт был про сложно воспринимаемый (человеком для быстрого осмысления) запрос, где много джоинов по текстовым полям. Не знаю, причем тут exist.
1. это странно считать, что за счет доп операции алгоритм будет менее эффективным. Если бы запросы были абсолютно идентичными и в один из них мы вставили доп операцию - это высказывание хотя бы логику имело.
2. Я не знаю, являются ли для постановщика задачи null равными между собой или нет. Спросите у постановщика.
3. Если домысливать нельзя, то изначально дискуссия не имеет смысла и подходит любой запрос для 5 строк. Если бы нельзя было "домысливать", то зачем вы сделали индексы для таблицы, а потом по ним план запроса построили?
4. Если у меня будет триллион записей и этот запрос не будет справляться, я буду смотреть какой запрос лучше справиться с триллионом записей, как я буду смотреть, какой запрос лучше справиться с миллионом записей.
...
Рейтинг: 0 / 0
149 сообщений из 149, показаны все 6 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопросы на собеседовании
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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