Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4 5 6      [все]
 Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
Всем привет!
Знает кто ответ? Можете пояснить ?

1.
Первый вопрос
Какой тип должен быть установлен вместо вопроса, чтобы метод работал корректно?

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


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


Но я его не понимаю, можете объяснить на пальцах как он работает ?
13 янв 19, 16:15    [21784057]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
public boolean simpleMethod(? a){
        return a + 1 == a;
    }


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

Во первых тип может быть любой из алгебраических (byte, short, int, long). Пожалуй кроме вещественных.
Во вторых результат - тождественно FALSE потому что для известных арифметик a + 1 == a дает отсутствие истины.
В третьих формат названия метода simpleMethod() ну... не прошел-бы code-review. Будут это спрашивать или нет ХЗ.
Но я-бы добавил к ответу.
13 янв 19, 16:26    [21784061]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
автор
Во вторых результат - тождественно FALSE потому что для известных арифметик a + 1 == a дает отсутствие истины

Тогда возникает вопрос для чего это метод нужен ? И зачем о нем вести речь на собеседовании если результат FALSE ?
13 янв 19, 16:30    [21784062]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Dr.Hofmann
Условие
Есть две таблицы Table1(Продукты) Table2(Магазины) тип многие ко многим.


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


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

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

SQL> SELET count(*) FROM Table1, Table2);
13 янв 19, 16:32    [21784064]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Dr.Hofmann
автор
Во вторых результат - тождественно FALSE потому что для известных арифметик a + 1 == a дает отсутствие истины

Тогда возникает вопрос для чего это метод нужен ? И зачем о нем вести речь на собеседовании если результат FALSE ?

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

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

На мой субъективный взгляд это легкий троллинг.
13 янв 19, 16:35    [21784065]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
1. на первый взгляд любые числовые, плюс стринга. может ругнется на что. суть вопроса видимо, соберется ли вообще или нет. верно?
2. непонятен вопрос. очевидно, Продукт, Магазин, ПродуктМагазин. третий не обязателен.
3. работает как дистинкт но только по имени
13 янв 19, 16:39    [21784067]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
mayton
Dr.Hofmann
пропущено...


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


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

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

SQL> SELET count(*) FROM Table1, Table2);

а мне показалось если речь о сущностях то говорят об орме. хотя в некоторых вопросах на собеседованиях искать смысл это как с черной кошкой которой нет не было никогда и не будет у этих людей.
13 янв 19, 16:42    [21784068]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
mayton, Я ответил так же как оба ваших поста - но к сожалению было сказано, что это не правильные ответы, на вопрос почему авторы оставили за собой право не давать никаких комментариев.
13 янв 19, 16:44    [21784069]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
mayton
Dr.Hofmann
пропущено...

Тогда возникает вопрос для чего это метод нужен ? И зачем о нем вести речь на собеседовании если результат FALSE ?

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

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

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


как тебе такой код:
void revert(boolean o)
if(o==true){
 o=false
}
13 янв 19, 16:45    [21784070]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Он не имеет эффекта.
13 янв 19, 16:46    [21784071]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
Dr.Hofmann
mayton, Я ответил так же как оба ваших поста - но к сожалению было сказано, что это не правильные ответы, на вопрос почему авторы оставили за собой право не давать никаких комментариев.

надо было настоять на озвучке их версии ответа и подискутировать. если отказываются - то проявить агрессию и назвать их тупыми неучами с которыми тебе не по пути и громко хлопнуть дверью.
13 янв 19, 16:47    [21784073]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Dr.Hofmann
mayton, Я ответил так же как оба ваших поста - но к сожалению было сказано, что это не правильные ответы, на вопрос почему авторы оставили за собой право не давать никаких комментариев.

Знакомая ситуация. Я лет 10 назад делал тестовые задания. Сейчас не делаю никогда. Именно по этой причине.
13 янв 19, 16:47    [21784074]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
mayton
Он не имеет эффекта.

и смысла
13 янв 19, 16:47    [21784075]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
andreykaT
Dr.Hofmann
mayton, Я ответил так же как оба ваших поста - но к сожалению было сказано, что это не правильные ответы, на вопрос почему авторы оставили за собой право не давать никаких комментариев.

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

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

А что это изменит? Лучше как можно быстрее разпрощайтесь и идите на следующий собес в другую контору.
13 янв 19, 16:49    [21784076]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
mayton
Dr.Hofmann
mayton, Я ответил так же как оба ваших поста - но к сожалению было сказано, что это не правильные ответы, на вопрос почему авторы оставили за собой право не давать никаких комментариев.

Знакомая ситуация. Я лет 10 назад делал тестовые задания. Сейчас не делаю никогда. Именно по этой причине.

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

не делайте тз никогда. поговорили и хватит.
13 янв 19, 16:53    [21784079]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Как называется контора?
13 янв 19, 16:54    [21784080]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
mayton
andreykaT
пропущено...

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

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

А что это изменит? Лучше как можно быстрее разпрощайтесь и идите на следующий собес в другую контору.

ну как зачем. выброс эмоций продлевает жизнь и делает человека счастливее ))
у меня товарищ так на собеседовании (не экстремально) и распрощался. сказал просто парни короче я всё понял давайте пока ищите кого-нибудь другого. это когда он спросил тестируете ли вы свой код а они сказали мы его пишем сразу без ошибок
13 янв 19, 16:54    [21784081]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
andreykaT
mayton
пропущено...

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

А что это изменит? Лучше как можно быстрее разпрощайтесь и идите на следующий собес в другую контору.

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

Надо просто иметь какой-то заряд иронии. Не знаю будет-ли интересно.
Есть украинский сайт йоб аное ойти https://ebanoe.it/ здесь полно всяких забавных историй.
Почитаешь ... и вроде как у тебя не всё так уж плохо
13 янв 19, 16:58    [21784083]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
автор
надо было настоять на озвучке их версии ответа и подискутировать. если отказываются - то проявить агрессию и назвать их тупыми неучами с которыми тебе не по пути и громко хлопнуть дверью.

Обычно агрессию проявляю если есть латентный пи...др который пытается до тебя докопаться или быдло который считает себя супергероем, в том контексте и ситуации таких людей не было)))

Контора инфосистемы джет по первому вопросу
13 янв 19, 17:06    [21784085]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Dr.Hofmann
автор
надо было настоять на озвучке их версии ответа и подискутировать. если отказываются - то проявить агрессию и назвать их тупыми неучами с которыми тебе не по пути и громко хлопнуть дверью.

Обычно агрессию проявляю если есть латентный пи...др который пытается до тебя докопаться или быдло который считает себя супергероем, в том контексте и ситуации таких людей не было)))

Контора инфосистемы джет по первому вопросу

Если это Skype-Call - просто положите трубку. Любые другие действия могут потенциально вас
внести в black-list для рекрутинга. Там проставят галочку - матершинник и неадекват а потом
сложно будет вобщем... Быть Платовым уёво.. и Адамовским тоже не сахар.
13 янв 19, 17:26    [21784090]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
справедливое замечание. но если ты не через РК то ... ну да всё равно лучше сдержаннее быть. земля то квадратная.
13 янв 19, 17:40    [21784092]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
RonibGreat
Member

Откуда:
Сообщений: 1252
mayton
Есть украинский сайт йоб аное ойти https://ebanoe.it/ здесь полно всяких забавных историй.

Насколько я знаю в том региноне украинцев нет. Зато есть много выходцев из Украины/Израиля. ;)

К сообщению приложен файл. Размер - 68Kb
13 янв 19, 18:00    [21784098]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
RonibGreat, ну ты содержание сайта читал?
13 янв 19, 18:27    [21784112]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
RonibGreat
Member

Откуда:
Сообщений: 1252
mayton
RonibGreat, ну ты содержание сайта читал?

Просмотрел... даже пару статей попробовал найти на других источниках, типа гугля, яндекса, кьюквикк, яху но не нашел. Вывыд: статьи высосаны из яйца. Дальше много контента с картинками, которые соответствуют тому чот проишодит в Калифорнии и никакого отношеия к другим регионам мира о которых пушут в статьях нет. Человек, сочняющий статьи явно пишт из Калифорнии, собственно о том что он видит вокруг себя. Тут и ка равину ходить не надо - простое наблюдение.

Я знаю русский, украинский хорошо и украинский/р(г)усский язык, культуру Украины - обороты речи в статьях далеко от Украины, то есть человек за этим сайтом на Украине не жил. Судя по однотипной плоскости статей - пишет один человек. Видимо у него хобби такое либо с головой не так - каждый приспосабливается в этом мире.
13 янв 19, 18:53    [21784130]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
RonibGreat
mayton
RonibGreat, ну ты содержание сайта читал?

Просмотрел... даже пару статей попробовал найти на других источниках, типа гугля, яндекса, кьюквикк, яху но не нашел. Вывыд: статьи высосаны из яйца. Дальше много контента с картинками, которые соответствуют тому чот проишодит в Калифорнии и никакого отношеия к другим регионам мира о которых пушут в статьях нет. Человек, сочняющий статьи явно пишт из Калифорнии, собственно о том что он видит вокруг себя. Тут и ка равину ходить не надо - простое наблюдение.

Я знаю русский, украинский хорошо и украинский/р(г)усский язык, культуру Украины - обороты речи в статьях далеко от Украины, то есть человек за этим сайтом на Украине не жил. Судя по однотипной плоскости статей - пишет один человек. Видимо у него хобби такое либо с головой не так - каждый приспосабливается в этом мире.

Это - развлекательный сайт. По крайней мере если ты читал дисклеймер внизу то там пишут.
13 янв 19, 18:54    [21784131]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
RonibGreat
Member

Откуда:
Сообщений: 1252
mayton,

Это надо быть с "хорошим" диагнозом чтобы так развлекаться. Хотя в Калифорнии все остальные равлечения стоят дорого. ;)
13 янв 19, 18:59    [21784134]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
При чем тут вообще Калифорния?
13 янв 19, 19:01    [21784136]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
RonibGreat
Member

Откуда:
Сообщений: 1252
mayton,

Имел ввиду в Южных Штатах. Хотя не исключено что чел живет имено в Калифорнии. Клаудера офис вроде как бы в Калифорнии (Сан-Франциско), где сайт хостится.
13 янв 19, 19:10    [21784145]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Вообще перпендикулярно где хостится.

Ладно давай проедем эту тему. Ты просто выброси конспирологические теории.
13 янв 19, 19:13    [21784146]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
RonibGreat
Member

Откуда:
Сообщений: 1252
mayton,

Да мне собственно пофиг. Я сейчас делаю отчетност по налогам за прошлый год, и так между прочим заглядываю на скл.ру.
13 янв 19, 19:17    [21784147]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
1. Вопрос для обсуждения. И первый мой вопрос был бы - что значит корректно?
На первый взгляд кажется, что любые целые числа и char.

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



3.

DELETE FROM table
WHERE id NOT IN (SELECT max(id) FROM table GROUP BY name HAVING count(id)>1)


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


DELETE FROM table
WHERE id IN (SELECT max(id) FROM table GROUP BY name HAVING count(id)>1)


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

DELETE FROM table
WHERE id IN (SELECT max(id) FROM table GROUP BY name, surname HAVING count(id)>1)
13 янв 19, 23:35    [21784350]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
Озверин
1.что значит корректно?

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


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

Как это сделать можете написать? у меня просто идей нет.
13 янв 19, 23:58    [21784357]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Dr.Hofmann,

так я и написал запрос с фамилией, самый нижний.
14 янв 19, 00:01    [21784359]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Dr.Hofmann, насчет true или false - ну тогда double.
14 янв 19, 00:08    [21784365]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Вот обитель зла https://jet.su/
Историю ведет с 93 года.
14 янв 19, 00:08    [21784366]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Озверин
Dr.Hofmann, насчет true или false - ну тогда double.


можете еще и float - где там бесконечности еще есть?
14 янв 19, 00:09    [21784368]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Сравнение с Nan и c Inf тоже будет давать false.
14 янв 19, 00:17    [21784374]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
mayton
Сравнение с Nan и c Inf тоже будет давать false.


вопрос был про тип. Если тип будет , допустим, double, то можно не только бесконечно передавать, но и обычное вещественное число. Вот и будет true или false.
14 янв 19, 00:18    [21784375]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Озверин
mayton
Сравнение с Nan и c Inf тоже будет давать false.


вопрос был про тип. Если тип будет , допустим, double, то можно не только бесконечно передавать, но и обычное вещественное число. Вот и будет true или false.

Беря во внимание общие правила сравнения вещественных чисел (через == не сравнивают).
Я-бы сказал что здесь очень маловероятно.
14 янв 19, 00:21    [21784378]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
Озверин
Dr.Hofmann,

так я и написал запрос с фамилией, самый нижний.

Я тупо не врубаюсь зачем вычислять максимальный id группировать по имени по фамилии, можно как-то по подробней этот момент объяснить:
SELECT max(id) FROM table GROUP BY name, surname HAVING count(id)>1
14 янв 19, 00:28    [21784384]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
mayton
Озверин
пропущено...


вопрос был про тип. Если тип будет , допустим, double, то можно не только бесконечно передавать, но и обычное вещественное число. Вот и будет true или false.

Беря во внимание общие правила сравнения вещественных чисел (через == не сравнивают).
Я-бы сказал что здесь очень маловероятно.


ну мне скахали, что надо true или false - мол так корректно.
14 янв 19, 00:29    [21784385]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Dr.Hofmann
Озверин
Dr.Hofmann,

так я и написал запрос с фамилией, самый нижний.

Я тупо не врубаюсь зачем вычислять максимальный id группировать по имени по фамилии, можно как-то по подробней этот момент объяснить:
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 отсеет записи, у которых нет дублпикатов.

Насчет, почему по имени и фамилии, да потому, что а вдруг имена будут совпадать в другой таблице, а фамилии - различаться?
14 янв 19, 00:36    [21784386]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
Озверин
Dr.Hofmann
пропущено...

Я тупо не врубаюсь зачем вычислять максимальный id группировать по имени по фамилии, можно как-то по подробней этот момент объяснить:
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 должны быть, поэтому понятно какой из них максимальный.
14 янв 19, 00:49    [21784389]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
Dr.Hofmann
Озверин
1.что значит корректно?

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

не ну если так загоняться то может речь о рейскандишене? а==а+1 это ж наверняка не атомарная.
14 янв 19, 00:52    [21784391]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
Озверин
Dr.Hofmann, насчет true или false - ну тогда double.

вот ведь срань я попробовал максинт и максбайт а максдабл не попробовал
вопрос из разряда как получить отрицательное значение из Math.abs
14 янв 19, 00:57    [21784396]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
Забыл написать вопрос:
автор
В памяти храняться 5 объектов которые сиквентально ссылаются друг на друга, попадут ли эти объекты под очистку в JVM gabrage коллектором, если не будет связи ссылки с одним из главных объектов в хипе?

Мой ответ был да, это правильно?
14 янв 19, 00:57    [21784397]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
имхо такое знать это либо столкнуться с каким нибудь гамнокодом где прошло переполнение и найти багу, либо загоняться пазлерами.
вопрос из разряда "сам вчера узнал".
14 янв 19, 01:00    [21784399]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
Dr.Hofmann
Забыл написать вопрос:
автор
В памяти храняться 5 объектов которые сиквентально ссылаются друг на друга, попадут ли эти объекты под очистку в JVM gabrage коллектором, если не будет связи ссылки с одним из главных объектов в хипе?

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

джиси рут если есть то не попадут. если нет то умрут.
14 янв 19, 01:01    [21784400]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Dr.Hofmann
Забыл написать вопрос:
автор
В памяти храняться 5 объектов которые сиквентально ссылаются друг на друга, попадут ли эти объекты под очистку в JVM gabrage коллектором, если не будет связи ссылки с одним из главных объектов в хипе?

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


я полез гуглить слово сиквентально. а что значит главный объект?
14 янв 19, 01:06    [21784408]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
Озверин
Dr.Hofmann
Забыл написать вопрос:
пропущено...

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


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

очередной вышибон )) последовательно сказать видать религия не позволяет они наверное ходят сугубо на ланчи и дринкают смузи.
речь о gc root https://stackoverflow.com/questions/27186799/what-are-gc-roots-for-classes
14 янв 19, 01:10    [21784410]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
мне вот интересно почему Integer.MAX_VALUE+1 не равно Integer.MAX_VALUE а Double.MAX_VALUE+1 равно Double.MAX_VALUE? чо за гон.
14 янв 19, 01:14    [21784411]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
Озверин
Dr.Hofmann
Забыл написать вопрос:
пропущено...

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


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


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;
14 янв 19, 01:16    [21784413]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
andreykaT
Озверин
пропущено...


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

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


вопрос не имеет смысла, потому что этих 5 гипотетических объектов могут располагаться в разных сегментах хипа и собственно быть этими самыми рутами. Потому я все еще слово сиквентально.
14 янв 19, 01:17    [21784414]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
не думаю что там кто то глубоко копал еще и придумали какой то главный объект. что за такой главный объект и насколько он главный. самый главный или не очень главный? ))
14 янв 19, 01:20    [21784415]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
andreykaT
не думаю что там кто то глубоко копал еще и придумали какой то главный объект. что за такой главный объект и насколько он главный. самый главный или не очень главный? ))

Извиняюсь не главный а рутовый объект А - будет рутовый ссылка someLink ссылается на него.
14 янв 19, 01:22    [21784417]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
andreykaT
мне вот интересно почему Integer.MAX_VALUE+1 не равно Integer.MAX_VALUE а Double.MAX_VALUE+1 равно Double.MAX_VALUE? чо за гон.

Double внутри имеет структуру научной формы записи. И для очень больших double добавление
Единички не оказывает влияния на мантиссу.. Это как к диаметру вселенной добавить ещё сантиметр.
14 янв 19, 01:23    [21784418]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
какие тонкости. т.е. где есть Е там плюс один дает ничего а где нет там оно оборачивается. какие оригиналы те кто делал жвм.
14 янв 19, 01:28    [21784421]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Dr.Hofmann
Озверин
пропущено...


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


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;


интересно, где такие вопросы спрашивают? Уже озвучивали?
14 янв 19, 01:29    [21784422]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
andreykaT
какие тонкости. т.е. где есть Е там плюс один дает ничего а где нет там оно оборачивается. какие оригиналы те кто делал жвм.


математика - бессердечная ты с**а. Бесконечность+1 = Бесконечность.
14 янв 19, 01:29    [21784423]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Давайте не вводить англицизмы.

Приводите оригинал. Без интерпретаций.
14 янв 19, 01:29    [21784424]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
Озверин
andreykaT
какие тонкости. т.е. где есть Е там плюс один дает ничего а где нет там оно оборачивается. какие оригиналы те кто делал жвм.


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

да но дабл то конечен. вот бигдец уже куда ни шло. а дабл не канает. максдабл логически ничем не отличается от максинта.
14 янв 19, 01:31    [21784425]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
andreykaT
Озверин
пропущено...


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

да но дабл то конечен. вот бигдец уже куда ни шло. а дабл не канает. максдабл логически ничем не отличается от максинта.


У дабла есть обозначение положительной бесконечности и отрицательной. И это не максдабл - это именно бесконечность.
14 янв 19, 01:35    [21784429]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
у дабла есть максимальное число. оно есть. оно известно. оно никуда не делось и оно конечно выше него число не получить. у бигинта нету.

а тут прям игрища как со скоростью света и теорией относительности
14 янв 19, 01:37    [21784431]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
насчет бесконечности.. если ты сделаешь бесконечность минус один ты вещественного числа не получишь. если ты "бесконечное число дабл" минус 1 сделаешь ты его получишь. следовательно максдабл != бесконечность.
14 янв 19, 01:39    [21784433]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
Озверин
вопрос не имеет смысла, потому что этих 5 гипотетических объектов могут располагаться в разных сегментах хипа и собственно быть этими самыми рутами. Потому я все еще слово сиквентально.

Можно рассмотреть два варианта? Когда они хранятся либо в Young или в Old generation.

Дополнительное уточнение к знатокам, ссылки на объекты разве в хипе храняться или Permanent generation ? или Non-heap Meta space?
14 янв 19, 01:42    [21784434]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
с джавы восемь вообще нет никакого пермгена. да и не хранятся (хранились) там никогда объекты которые ты создаешь в приложении. там чот с классами и их метадатой связано.
14 янв 19, 01:45    [21784435]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
сорян, не объекты разумеется, а ссылки на них. а то ща заклюют )
14 янв 19, 01:46    [21784437]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
Или не. Объекты. )) Короче я спать
14 янв 19, 01:50    [21784438]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
andreykaT
сорян, не объекты разумеется, а ссылки на них. а то ща заклюют )

кроме статических переменных и статических ссылок которые хранятся в метаспейсе?
14 янв 19, 01:50    [21784439]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Озверин
andreykaT
какие тонкости. т.е. где есть Е там плюс один дает ничего а где нет там оно оборачивается. какие оригиналы те кто делал жвм.


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

А можно ещё сравнивать бесконечности.

И окажется что одни из них больше других.
14 янв 19, 10:01    [21784504]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
vsl
Member

Откуда:
Сообщений: 44
Озверин
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 из скобочек убираем.


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

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

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 оставим топикстартеру как упражнение.
14 янв 19, 18:38    [21785072]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
vsl,

1. может быть с набором данных это и имелось ввиду. Из постановки вообще мало что понятно.
2. Запрос составлен корректно, сколько бы дубликатов там не было. Вы как-то излишне усложнили довольно простой запрос.
14 янв 19, 18:54    [21785086]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
vsl, насчет комбинаторики, я как бе не очень помню, но есть подозрение, что тут присутствует количество сочетаний без повторений, а это - n1(для варианта, когда n=m).
14 янв 19, 19:10    [21785099]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Озверин
vsl, насчет комбинаторики, я как бе не очень помню, но есть подозрение, что тут присутствует количество сочетаний без повторений, а это - n1(для варианта, когда n=m).


n!
14 янв 19, 19:10    [21785101]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Озверин
Озверин
vsl, насчет комбинаторики, я как бе не очень помню, но есть подозрение, что тут присутствует количество сочетаний без повторений, а это - n1(для варианта, когда n=m).


n!


а ну нет. Комбинаторика - ваще не мое.
14 янв 19, 19:21    [21785115]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
vsl
Member

Откуда:
Сообщений: 44
Озверин
2. Запрос составлен корректно, сколько бы дубликатов там не было. Вы как-то излишне усложнили довольно простой запрос.


|id|name|surname|
|1 |Вася|Петров |
|2 |Вася|Петров |
|3 |Вася|Петров |
|4 |Боря|Петров |

Запрос вида
delete from where id in (select max(id) .... having ...)
просто по определению удалит только одну строчку для каждой группы дубликатов. В моём примере будет удалена строка с id=4, и запрос придётся прогонять повторно, чтобы удалить ещё и строку с id=3.
Поэтому нужно выбирать для удаления все строки, относящиеся к дубликатам, кроме какой-то одной.
14 янв 19, 19:21    [21785116]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
vsl
Member

Откуда:
Сообщений: 44
Озверин
Озверин
vsl, насчет комбинаторики, я как бе не очень помню, но есть подозрение, что тут присутствует количество сочетаний без повторений, а это - n1(для варианта, когда n=m).

n!

Нет, n! - это перестановки, а не сочетания.
Но можно даже без комбинаторики. Есть n товаров, каждый из них либо есть в магазине, либо нет => получаем двоичное число разрядностью n, что даёт 2**n значений. Минус 1, если исключать вариант «магазин без товаров».
14 янв 19, 19:24    [21785122]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
vsl
Озверин
2. Запрос составлен корректно, сколько бы дубликатов там не было. Вы как-то излишне усложнили довольно простой запрос.


|id|name|surname|
|1 |Вася|Петров |
|2 |Вася|Петров |
|3 |Вася|Петров |
|4 |Боря|Петров |

Запрос вида
delete from where id in (select max(id) .... having ...)
просто по определению удалит только одну строчку для каждой группы дубликатов. В моём примере будет удалена строка с id=4, и запрос придётся прогонять повторно, чтобы удалить ещё и строку с id=3.
Поэтому нужно выбирать для удаления все строки, относящиеся к дубликатам, кроме какой-то одной.


кстати, да. Для таблиц с дубликатом записей более 2х - проблема ;(
14 янв 19, 19:37    [21785131]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Добралсо до дома, написал более читаемый запрос:

SELECT id
FROM NAMES
WHERE 
id IN(SELECT min(id) FROM NAMES GROUP BY name HAVING count(id)>1 OR count(id)=1);
14 янв 19, 21:58    [21785224]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

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

Я не въезжаю двойка откуда взялась?
Поясните пожалуйста.
14 янв 19, 22:02    [21785227]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
vsl
Member

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

Я не въезжаю двойка откуда взялась?
Поясните пожалуйста.


Писал дальше.
vsl
Есть n товаров, каждый из них либо есть в магазине, либо нет => получаем двоичное число разрядностью n, что даёт 2**n значений. Минус 1, если исключать вариант «магазин без товаров».
15 янв 19, 00:02    [21785298]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
vsl
Member

Откуда:
Сообщений: 44
Озверин
Добралсо до дома, написал более читаемый запрос:

«Я печатаю со скоростью 800 знаков в минуту... но такая фигня получается...»

Озверин
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, то можно и без него (по крайней мере, в тексте):
delete from table where id in (
  select id from table
  minus
  select min(id) from table group by name, surname
)
15 янв 19, 00:10    [21785307]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 381
Примерно так
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
15 янв 19, 01:50    [21785318]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
vsl
Озверин
Добралсо до дома, написал более читаемый запрос:

«Я печатаю со скоростью 800 знаков в минуту... но такая фигня получается...»

Озверин
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, то можно и без него (по крайней мере, в тексте):
delete from table where id in (
  select id from table
  minus
  select min(id) from table group by name, surname
)


странные у вас комментарии, просто вместо SELECT использовать DELETE - очевидно же.
Мне не нравятся join`ы по текстовым полям, да еще и по нескольким. Имею право, почему нет?
15 янв 19, 08:23    [21785359]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
vsl, а насчет minus - ну это специфичная инструкция не из стандарта SQL.
15 янв 19, 08:24    [21785360]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
niteshade
Member

Откуда:
Сообщений: 10
Озверин,
Пожалуйста, посмотрите на запрос на удаление дубликатов в самом первом посте темы.
Он правильный. Зачем уже четвёртую страницу вы его неправильно переписываете?
15 янв 19, 08:39    [21785363]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3425
niteshade
Он правильный.
Нет, там еще фамилия же. Вообщем в лоб (без всяких group by, аналитических функций и пр):
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. кто
15 янв 19, 09:09    [21785371]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
niteshade
Озверин,
Пожалуйста, посмотрите на запрос на удаление дубликатов в самом первом посте темы.
Он правильный. Зачем уже четвёртую страницу вы его неправильно переписываете?


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

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

SELECT max(id) FROM table GROUP BY name HAVING count(id)>1

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

DELETE FROM table
WHERE id NOT IN(...)


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

То есть те записи, которые НЕ дублируются, будут удалены, останутся только дубликаты с максимальным айди - все наоборот же.
15 янв 19, 09:15    [21785374]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
vsl
Member

Откуда:
Сообщений: 44
Озверин
vsl, а насчет minus - ну это специфичная инструкция не из стандарта SQL.

Нет minus - будет except или ещё что-нибудь. Не будет ничего - значит, не повезло, возвращаемся к join'ам.

Вариант с exists, который предлагался ниже, тоже не из стандарта - насколько я помню, в стандарте (по крайней мере, в 92) нельзя назначать alias таблицам у delete и update.
15 янв 19, 09:43    [21785388]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
vsl
Озверин
vsl, а насчет minus - ну это специфичная инструкция не из стандарта SQL.

Нет minus - будет except или ещё что-нибудь. Не будет ничего - значит, не повезло, возвращаемся к join'ам.

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


возвращайтесь к join`ам, кто ж против. Но есть варианты и без них обойтись.
стандарт ныне 2008 года, но, думаю, что в 92 все это было, правда, я не понимаю, к чему вы это говорите.
15 янв 19, 09:52    [21785392]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
vsl
Member

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


странные у вас комментарии, просто вместо SELECT использовать DELETE - очевидно же.
Мне не нравятся join`ы по текстовым полям, да еще и по нескольким. Имею право, почему нет?

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

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

Ладно, вот вам другое решение без join'ов:
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
)
15 янв 19, 09:59    [21785395]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
vsl, так мой последний запрос - некорректен?
15 янв 19, 10:05    [21785398]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
vsl
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
)


максимально понятный запрос ;)))))
ладно, хватит меня веселить, примените свои знания и злобу лучше к своей работе.
15 янв 19, 10:07    [21785400]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
vsl
Member

Откуда:
Сообщений: 44
Озверин
vsl, так мой последний запрос - некорректен?

Конечно. Возможно, вы хотели написать там NOT IN, но не написали.
delete from table where id NOT in (select min(id) from table group by name, surname)

Вот так было бы нормально.
15 янв 19, 10:15    [21785403]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
vsl
Озверин
vsl, так мой последний запрос - некорректен?

Конечно. Возможно, вы хотели написать там NOT IN, но не написали.
delete from table where id NOT in (select min(id) from table group by name, surname)

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


Я написал выбору "правильных" кодов, если вы не обратили внимание. Переделать на DELETE - как бе вопрос не сложный ;)
15 янв 19, 10:16    [21785404]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
vsl, ну и то, что вы написали - неправильно ;(
15 янв 19, 10:17    [21785407]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Озверин
vsl, ну и то, что вы написали - неправильно ;(


ну по крайней мере не то, что писал я. Хотя, можно и так, видимо ;)
15 янв 19, 10:18    [21785408]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 381
Андрей Панфилов
niteshade
Он правильный.
Нет, там еще фамилия же. Вообщем в лоб (без всяких group by, аналитических функций и пр):

Я вот уверен, что на собеседовании как раз хотят проверить знает ли претендент как раз эти самый аналитические. И другие решения в зачет просто не пойдут ибо "не знает".
Также как в первом вопросе - знает ли про потерю точности при сложении в "плавающей арифметике". Хотя сформулирована 1 задача в каком-то олимпиадном стиле.
15 янв 19, 10:44    [21785430]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3425
Пылинка
Я вот уверен, что на собеседовании как раз хотят проверить знает ли претендент как раз эти самый аналитические.
А какой смысл проверять знает кандидат аналитические функции (или хотябы о их существовании) или нет? На их изучение нужно от силы потратить неделю, так что их знание или незнание никак не добавляет и не умаляет ценности кандидата, а вот внимательность - это офигеть какой важный навык, который из за год не получить.
15 янв 19, 11:03    [21785438]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Пылинка
Member

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

А зачем тогда вообще проверять знание SQL? Его аналогично можно "изучить". Аналогично можно "за неделю изучить" множество разных вещей.
Про смысл нужно спрашивать у тех кто задания задает, я лишь пытаюсь смоделировать их цели, понять какие они критерии используют при тестировании, для конкретной узкой задачи - успешно пройти их тест (выдать им ожидаемый ответ).
15 янв 19, 11:40    [21785472]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3425
Пылинка
А зачем тогда вообще проверять знание SQL? Его аналогично можно "изучить". Аналогично можно "за неделю изучить" множество разных вещей.
Как это для чего? чтобы начать общаться, например, в этом топике никто так и не смог привести правильный ответ: все приведенные запросы могут как удалить "не дубликаты", так и не удалить дубликаты, просто потому, что в базу доступ обычно конкурентный.
15 янв 19, 12:26    [21785540]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Смотрите. Само по себе знание SQL назубок никому не нужно. Пускай этим бравируют
ребята в топика Oracle по пятницам.

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

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

А зубрёжка SQL - это дело практики.
15 янв 19, 12:39    [21785550]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

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


а какой правильный запрос может гарантированно удалить все дубликаты, которые появятся после? Я чего то не понял.
Если вы про уровень изоляции транзакции типа READ COMMITED, то это режим по умолчанию для баз, а AutoCommit нынче стоит по умочланию в большинстве реализаций jdbc драйверов.
15 янв 19, 13:02    [21785574]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3425
Озверин
а какой правильный запрос может гарантированно удалить все дубликаты, которые появятся после? Я чего то не понял.
Ну а "после" тут причем? вот вы в delete завязались на то, что удаляете все что не min/max, какие гарантии что в соседней сессии кто-то этот самый min/max не удалит?
15 янв 19, 13:12    [21785589]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Андрей Панфилов
Озверин
а какой правильный запрос может гарантированно удалить все дубликаты, которые появятся после? Я чего то не понял.
Ну а "после" тут причем? вот вы в delete завязались на то, что удаляете все что не min/max, какие гарантии что в соседней сессии кто-то этот самый min/max не удалит?


там, где having count(id)>1 - таким.
15 янв 19, 13:14    [21785594]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3425
Озверин
там, где having count(id)>1 - таким.
это как? вот вы запустили свой убер-delete, в соседней сессии ваш min/max удалили, ваша транзакция этот min/max все еще видит, что получаем на выходе? удаленный "недубликат".
15 янв 19, 13:34    [21785622]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

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


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

В общем случае - это решается блокировкой таблицы, но это также не относится к запросу, а только к реализации или логики приложению.
15 янв 19, 14:10    [21785673]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Ilya007
Member

Откуда:
Сообщений: 121
Я так думаю лучше вот такой вопрос задать - сразу видно, что человек писал на JAVA, а не книжку прочитал:

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

public boolean equalsMethod(String a){

return a.equals("String");
}
15 янв 19, 15:08    [21785779]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Ilya007,

Потенциальный NPE.
15 янв 19, 15:19    [21785792]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
это проблема?
15 янв 19, 15:22    [21785800]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
andreykaT
это проблема?

Это не проблема. Это просто code review point.
15 янв 19, 15:31    [21785819]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1980
Ilya007
Я так думаю лучше вот такой вопрос задать - сразу видно, что человек писал на JAVA, а не книжку прочитал:
Что не так с методом? и почему.
public boolean equalsMethod(String a){
return a.equals("String");
}

Это что еще за ахтунг!!? )))
ну фиг с ним нуллПоинтерЭксепшеном) ревертнём икьюалс и избавимся от него.
Но что этот метод вообще за ерунду делает?)
15 янв 19, 16:47    [21785900]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Да. Второй поинт это Naming convention.

Название метода должно говорить о сути.
15 янв 19, 17:07    [21785931]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
да, надо его назвать иквалз и заоверрайдить
15 янв 19, 17:33    [21785970]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
Nixic
Ilya007
Я так думаю лучше вот такой вопрос задать - сразу видно, что человек писал на JAVA, а не книжку прочитал:
Что не так с методом? и почему.
public boolean equalsMethod(String a){
return a.equals("String");
}

Это что еще за ахтунг!!? )))
ну фиг с ним нуллПоинтерЭксепшеном) ревертнём икьюалс и избавимся от него.
Но что этот метод вообще за ерунду делает?)

нормально всё. там чуть выше вон даблы на переполнение проверяют сравниванием дабл==дабл+1
15 янв 19, 17:34    [21785971]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Ilya007
Member

Откуда:
Сообщений: 121
mayton
Ilya007,

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


Это верный ответ.
15 янв 19, 17:40    [21785984]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
Ilya007,

юзай опшн
15 янв 19, 17:42    [21785990]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
забыл ник
Member

Откуда:
Сообщений: 3159
Ilya007
Я так думаю лучше вот такой вопрос задать - сразу видно, что человек писал на JAVA, а не книжку прочитал:

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

public boolean equalsMethod(String a){

return a.equals("String");
}

Правильный ответ - этот метод нах не нужен
15 янв 19, 17:45    [21785995]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
Ilya007
Я так думаю лучше вот такой вопрос задать - сразу видно, что человек писал на JAVA, а не книжку прочитал:

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

public boolean equalsMethod(String a){

return a.equals("String");
}


А в чем прикол ? Проверки на null нету ?
15 янв 19, 18:23    [21786042]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Ilya007
Member

Откуда:
Сообщений: 121
Dr.Hofmann
Ilya007
Я так думаю лучше вот такой вопрос задать - сразу видно, что человек писал на JAVA, а не книжку прочитал:

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

public boolean equalsMethod(String a){

return a.equals("String");
}


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


Может прийти null и тогда на методе a.equals - сломается (NPE). Нужно писать всегда так "String".equals(a);.
15 янв 19, 18:28    [21786046]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Dr.Hofmann
Member

Откуда:
Сообщений: 249
Ilya007
Dr.Hofmann
пропущено...


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


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


Это из-за типа хранения стринг пула в случае "String", где храняться строки а не объекты поэтому NPE не выбрасывается? Так ?
15 янв 19, 18:52    [21786064]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
Dr.Hofmann
Ilya007
пропущено...


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


Это из-за типа хранения стринг пула в случае "String", где храняться строки а не объекты поэтому NPE не выбрасывается? Так ?

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

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

Или по крайней мере не доказывается ее невозможность.
15 янв 19, 19:58    [21786131]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
Ilya007
Dr.Hofmann
пропущено...


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


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

не согласен.
считаю что там где ты не ожидаешь никогда увидать нпе ты не должен его хендлить.
если придет нпе и ты сделаешь так как нужно делать всегда то ты вместо нпе вообще получишь фолс который пробросится дальше и алга лови жуков в самых необычных местах.
15 янв 19, 20:11    [21786145]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
andreykaT
Member

Откуда:
Сообщений: 2640
Dr.Hofmann
Ilya007
пропущено...


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


Это из-за типа хранения стринг пула в случае "String", где храняться строки а не объекты поэтому NPE не выбрасывается? Так ?

что такое тип хранения стрингпула? что за строки а не объекты? объекты это тоже строки. стрингпул это тоже объект. можно ли сравнивать стрингпул со стрингой -> нет. Уважаемый Майтон уже сказал почему.
15 янв 19, 20:13    [21786148]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
mayton
Member

Откуда: loopback
Сообщений: 44647
andreykaT
Ilya007
пропущено...


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

не согласен.
считаю что там где ты не ожидаешь никогда увидать нпе ты не должен его хендлить.
если придет нпе и ты сделаешь так как нужно делать всегда то ты вместо нпе вообще получишь фолс который пробросится дальше и алга лови жуков в самых необычных местах.

Это спор о цене последствий.
15 янв 19, 20:20    [21786153]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
niteshade
Member

Откуда:
Сообщений: 10
Озверин
niteshade
Озверин,
Пожалуйста, посмотрите на запрос на удаление дубликатов в самом первом посте темы.
Он правильный. Зачем уже четвёртую страницу вы его неправильно переписываете?


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

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

SELECT max(id) FROM table GROUP BY name HAVING count(id)>1

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

DELETE FROM table
WHERE id NOT IN(...)

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

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

да, был невнимателен
правильный:
DELETE FROM table
WHERE id NOT IN (SELECT max(id) FROM table GROUP BY name, surname)

определение оригинала, как записи с минимальным id - это ваше домысливание
тем не менее, в такой постановке заменяем max на min
17 янв 19, 06:00    [21787447]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
niteshade
Member

Откуда:
Сообщений: 10
Андрей Панфилов
niteshade
Он правильный.
Нет, там еще фамилия же. Вообщем в лоб (без всяких group by, аналитических функций и пр):
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. кто

есть типовой запрос:
DELETE FROM table
WHERE id NOT IN (SELECT max(id) FROM table GROUP BY name, surname)

он просто и эффективен
зачем переписывать его в более сложной и менее эффективной форме?
17 янв 19, 06:05    [21787449]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3425
niteshade
есть типовой запрос:
DELETE FROM table
WHERE id NOT IN (SELECT max(id) FROM table GROUP BY name, surname)

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


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

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> 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)
17 янв 19, 07:00    [21787455]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
niteshade, он правильный только для данного набора данных, вроде уже обсудили.
17 янв 19, 08:24    [21787466]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Андрей Панфилов, а почему во втором случае 0 physical reads?
17 янв 19, 09:33    [21787492]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Озверин,

"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 записей и при условии, что ни одна из них не будет удалена. В случае, если перейти на выборку по одному текстовому полю, а не по двум - результаты остаются очень похожими.
17 янв 19, 09:58    [21787515]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Озверин,


-- 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);
17 янв 19, 09:59    [21787519]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Озверин,

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

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);
17 янв 19, 10:00    [21787520]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Озверин,

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

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 - надо бе разогреться.
17 янв 19, 10:09    [21787530]     Ответить | Цитировать Сообщить модератору
 Re: Вопросы на собеседовании  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3425
Озверин
а почему во втором случае 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 условие нужно добавлять уже в два места чтобы они коррелировали
  • 17 янв 19, 10:16    [21787540]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    Озверин
    Member

    Откуда: Ростов-на-Дону
    Сообщений: 5183
    Андрей Панфилов, так если сделать 15 млн, то и не ляжет вся она в память, а только - частично. О том и разговор, что первый запрос при всей неэффективности отработал всего на 1 секунду медленее, но НА ДИСКЕ. Короче, на неразогретом оракле. В моем случае он отработал быстрее в обоих случаях.

    1. это специфичное для оракла? В пг группировка по null - всегда отдельная группа и никакого сравнения просто нет.
    2. пустой primary key? это уже эффект какой-то подозрительный.
    3.при like уже под большим вопросом вообще использование индексов, так что делать то вы можете что угодно, но как это повлияет на план запроса - вы не знаете. Правда я вообще не понял, про что этот пункт.
    17 янв 19, 11:10    [21787600]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    Озверин
    Member

    Откуда: Ростов-на-Дону
    Сообщений: 5183
    Озверин, единственное, что, для PG - not in менее эффективен в плане работы, чем exists. Потому можно на него перейти, проверить.
    17 янв 19, 11:13    [21787603]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    niteshade
    Member

    Откуда:
    Сообщений: 10
    Андрей Панфилов
    niteshade
    есть типовой запрос:
    DELETE FROM table
    WHERE id NOT IN (SELECT max(id) FROM table GROUP BY name, surname)
    

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


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

    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> 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)
    

    индексы откуда появились?
    опять домысливания?
    17 янв 19, 11:53    [21787659]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    niteshade
    Member

    Откуда:
    Сообщений: 10
    Для Oracle всё ещё проще:
    DELETE FROM table
    WHERE not rowid IN (SELECT max(rowid) FROM table GROUP BY name, surname)
    
    17 янв 19, 11:59    [21787671]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    chpasha
    Member

    Откуда:
    Сообщений: 8810
    Озверин
    для PG

    для PG кстати работает еще такой запрос (не знаю, пробегал ли - не читал топик целиком)
    DELETE   FROM table_with_dups T1
      USING       table_with_dups T2
    WHERE  T1.ctid    < T2.ctid     
      AND  T1.name    = T2.name 
    
    17 янв 19, 11:59    [21787673]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    Озверин
    Member

    Откуда: Ростов-на-Дону
    Сообщений: 5183
    niteshade
    индексы откуда появились?
    опять домысливания?


    не откуда, а какие - полнотекстовые какие-нибудь.
    17 янв 19, 11:59    [21787674]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    niteshade
    Member

    Откуда:
    Сообщений: 10
    Озверин,
    это уже какая-то яростная дичь)
    в первом сообщении топика есть условия
    исходя из них необходимо решить задачу
    может, хватит уже натягивать сову на глобус?))
    17 янв 19, 12:12    [21787692]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    Озверин
    Member

    Откуда: Ростов-на-Дону
    Сообщений: 5183
    chpasha
    Озверин
    для PG

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


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

    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 -специфичен для базы.
    17 янв 19, 12:17    [21787697]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    Озверин
    Member

    Откуда: Ростов-на-Дону
    Сообщений: 5183
    niteshade
    Озверин,
    это уже какая-то яростная дичь)
    в первом сообщении топика есть условия
    исходя из них необходимо решить задачу
    может, хватит уже натягивать сову на глобус?))


    вопрос пошел немного дальше. Правильные запросы уже были. Что вам не нравится? Не хотите - не обсуждайте.
    17 янв 19, 12:18    [21787700]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    Озверин
    Member

    Откуда: Ростов-на-Дону
    Сообщений: 5183
    Озверин
    chpasha
    пропущено...

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


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

    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 -специфичен для базы.


    а не, вроде все ок.
    17 янв 19, 12:22    [21787702]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    mayton
    Member

    Откуда: loopback
    Сообщений: 44647
    Execution plan будем смотреть?

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

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

    И зачем мы это мурыжым?
    17 янв 19, 14:57    [21787949]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    Озверин
    Member

    Откуда: Ростов-на-Дону
    Сообщений: 5183
    Я ждал выступления начальника транспортного цеха и вади...
    17 янв 19, 15:14    [21787976]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    Андрей Панфилов
    Member

    Откуда: Москва > Melbourne
    Сообщений: 3425
    Озверин
    так если сделать 15 млн, то и не ляжет вся она в память, а только - частично.
    Ну а какая разница-то? С group by появляется дополнительная операция, как ни крути, она чего-то да и стоит, а изначальный пойнт был в том, что exists - ну это вообще супер сложно и неэффективно, пока автору сего утверждения правоту доказать не удалось.

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

    idname
    1null
    2null

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

    idname
    2null

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

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

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

    В целом же, любая логика, основанная на отрицании - она априори неправильная, потому что заставляет думать в четыре раза больше, так что если можно писать прямо, то нужно так и делать.
    17 янв 19, 16:09    [21788086]     Ответить | Цитировать Сообщить модератору
     Re: Вопросы на собеседовании  [new]
    Озверин
    Member

    Откуда: Ростов-на-Дону
    Сообщений: 5183
    Андрей Панфилов,

    0. Изначальный поинт был про сложно воспринимаемый (человеком для быстрого осмысления) запрос, где много джоинов по текстовым полям. Не знаю, причем тут exist.
    1. это странно считать, что за счет доп операции алгоритм будет менее эффективным. Если бы запросы были абсолютно идентичными и в один из них мы вставили доп операцию - это высказывание хотя бы логику имело.
    2. Я не знаю, являются ли для постановщика задачи null равными между собой или нет. Спросите у постановщика.
    3. Если домысливать нельзя, то изначально дискуссия не имеет смысла и подходит любой запрос для 5 строк. Если бы нельзя было "домысливать", то зачем вы сделали индексы для таблицы, а потом по ним план запроса построили?
    4. Если у меня будет триллион записей и этот запрос не будет справляться, я буду смотреть какой запрос лучше справиться с триллионом записей, как я буду смотреть, какой запрос лучше справиться с миллионом записей.
    17 янв 19, 17:33    [21788167]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: 1 2 3 4 5 6      [все]
    Все форумы / Java Ответить