powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопросы на собеседовании
25 сообщений из 149, страница 4 из 6
Вопросы на собеседовании
    #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
25 сообщений из 149, страница 4 из 6
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопросы на собеседовании
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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