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

Откуда:
Сообщений: 248
автор
Итого для 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

Откуда: СПб
Сообщений: 330
Примерно так
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
Сообщений: 3247
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

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

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

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

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

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