Полный разбор SQL задач из Кремниевой долины (FAANG)

แชร์
ฝัง
  • เผยแพร่เมื่อ 17 ต.ค. 2024

ความคิดเห็น • 178

  • @iliya_x4637
    @iliya_x4637 2 ปีที่แล้ว +75

    хотим больше SQL!

    • @Noukash
      @Noukash  2 ปีที่แล้ว +4

      Будет больше обязательно!

  • @ivantheengineer9422
    @ivantheengineer9422 2 ปีที่แล้ว +15

    Спасибо за примеры! Так легко и непринужденно получилось решить задачи, как 2+2 😁

  • @ЖанеттаМакарова-е5в
    @ЖанеттаМакарова-е5в 2 ปีที่แล้ว +12

    Спасибо Андрей 😉Стало понятно, какого уровня бывают задачи. Очень было интересно и поучительно.

    • @mkalalaka
      @mkalalaka 2 ปีที่แล้ว

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

  • @АлександраРыбинская-п3л
    @АлександраРыбинская-п3л ปีที่แล้ว

    Формат супер! Ждем больше таких видео!

  • @ericbagdasarov6242
    @ericbagdasarov6242 2 ปีที่แล้ว +3

    Однозначно нужно больше таких видео. 👍🏻🙏🏻

  • @ЮлияХусяинова-д2о
    @ЮлияХусяинова-д2о 2 ปีที่แล้ว +1

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

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Добро пожаловать обратно на канал :)

  • @anatoliyivanov834
    @anatoliyivanov834 2 ปีที่แล้ว +9

    В третьем примере для большей корректности (еслим мы не хотим полагаться на уникальность имени) нужно оставлять группировку по id покупателя и джойнить снаружи с таблицей покупателей.

    • @СяотестерСяомей
      @СяотестерСяомей ปีที่แล้ว

      Не то что не хотим, а не должны. Одинаковые имена - это не исключение какое то, а вполне себе реальная реальность.

  • @savagesavage6923
    @savagesavage6923 2 ปีที่แล้ว +2

    Интересно рассказываешь, логику и последовательность решения наглядно, спасибо за материал!

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Спасибо! Будут ещё такие видео с решением задач :)

  • @polinavashinko5955
    @polinavashinko5955 2 ปีที่แล้ว +11

    Большое спасибо за труд!
    Было бы здорово, если бы вы сняли ролик по SQL для новичков:)

    • @Noukash
      @Noukash  2 ปีที่แล้ว +1

      У меня уже есть пару роликов на канале про SQL, но сниму ещё

  • @san1araNN
    @san1araNN 2 ปีที่แล้ว +5

    Учитывая, что я trainee data analyst, ролик сложноватый) Но есть куда расти!) Спасибо за информацию!

    • @Noukash
      @Noukash  2 ปีที่แล้ว +1

      Рад, что ролик полезный!

    • @ВитКоммерс
      @ВитКоммерс 2 ปีที่แล้ว +1

      После первого месяца на работе покажется легковатым, так что желаю вам скорее к этому прийти!)

  • @RabGoda
    @RabGoda 2 ปีที่แล้ว +12

    Всё-таки Limit не всегда самое лучшее решение, лучше наверное показать через вложенный запрос, а то начнут везде его использовать когда можно или нельзя)
    Особенно если данных много и тебе нужно найти допустим строки с MAX значением, а их может быть 100.
    Но тут соглашусь что лимит идеально заходит )

    • @Noukash
      @Noukash  2 ปีที่แล้ว +1

      Полностью согласен! Бывает много случаев, когда он не заходит - например, когда множество строк с одинаковым значением :)

    • @vaccino3668
      @vaccino3668 2 ปีที่แล้ว +3

      Подобные фокусы делаются через оконные функции...

    • @СяотестерСяомей
      @СяотестерСяомей ปีที่แล้ว

      @@vaccino3668 Зачем? В данном случае пример тривиальный. Если задача решается простыми запросами - то нужно ее решать простыми запросами, а не пардон из**аться показывая что ты "умеешь оконные функции", так как самое простое решение - обычно и самое быстрое. По поводу подзапросов - это удобный инструмент, но в данном случае он тоже избыточен, а в практических задачах - их(поздапросы, особенно вложенные) нужно использовать крайне аккуратно, так как неоптимально сконструированный сложный запрос по большим таблицам может иметь очень высокую стоимость(в смысле ресурсов на его выполнение) и порой существенно замедлить работу вашего приложения. Если есть сомнения в эффективности решения - можно использовать EXPLAIN и изучить что на самом деле делает сервер БД при выполнении ваших конструкций(к каким таблицам и каким образом обращается, какие индексы при этом использует, сколько строк извлекается из каждой таблицы и сколько суммарно строк было извлечено чтобы обслужить ваш запрос). Так же, некоторые реализации СУБД дают рекомендации в случае обнаружения неоптимальных конструкций(например можноу видеть рекомендацию добавить в таблицу индекс на определенную колонку).

  • @IT-xr2zh
    @IT-xr2zh 2 ปีที่แล้ว +3

    спасибо за разборы!

  • @bogdandanilin7717
    @bogdandanilin7717 ปีที่แล้ว

    Спасибо за видео

  • @MichaelKarafyolov
    @MichaelKarafyolov 2 ปีที่แล้ว

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

  • @Вавилон-й5у
    @Вавилон-й5у 2 ปีที่แล้ว +1

    Ура. Частота видео радует

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Да - стабильно 2 в неделю

  • @Oleksii_Trotsenko
    @Oleksii_Trotsenko 2 ปีที่แล้ว +1

    Спасибо за видео. Супер контент, побольше практики

  • @TheSashkaboy
    @TheSashkaboy 2 ปีที่แล้ว

    Не сильно сложные задачки, это радует)

  • @Даниэль-х3л
    @Даниэль-х3л 2 ปีที่แล้ว +1

    Хоть я ещё и не начал изучать SQL но после этого видео будто пришло прозрение как понимать логику кода

    • @Noukash
      @Noukash  2 ปีที่แล้ว +1

      Ура! Этого я и хотел достичь :)

  • @codedemerald5733
    @codedemerald5733 2 ปีที่แล้ว +5

    Интересное видео! Кстати, ты используешь в своей работе питон? Пандас, нп, и так далее. Если да, то можешь рассказать про этот язык программирования в аналитике? Спасибо 👍

    • @Noukash
      @Noukash  2 ปีที่แล้ว +2

      Обязательно расскажу больше про практическую сторону питона

  • @staspanyukov4822
    @staspanyukov4822 2 ปีที่แล้ว +1

    Спасибо за отличный контент!

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Спасибо за комментарий!

  • @edilturdumambetov389
    @edilturdumambetov389 2 ปีที่แล้ว

    Привет, Андрей! Вопрос: сайт, на котором вы решаете задачи в видео, это некий официальный портал от Мета или что-то другое?

  • @user-oi1yq1dz8e
    @user-oi1yq1dz8e ปีที่แล้ว

    Спасибо большое! А есть ли уроки на когортный анализ?

  • @dmitrypilipets5031
    @dmitrypilipets5031 2 ปีที่แล้ว +10

    это просто сюр! назовите видео как положено: "разбор SQL задач экстремистских организаций"

  • @tsv8560
    @tsv8560 2 ปีที่แล้ว +1

    По первой задаче. Все эти решения как бы не совсем верны. Точнее они верны только на определенном наборе данных. Например ваше решение, насколько я понял, не учитывает что посылать можно несколько раз. Т.е. 1 числа послал - не принял, 2 - не принял, 3его - принял. Но по вашему запросу все 3 числа будут 100% принятие. (т.е. при таблице: send, send, accepted результат будет сомнителен)

  • @farit.bashirov
    @farit.bashirov 2 ปีที่แล้ว

    Спасибо за видео. Познавательно. Только лучше сразу уточнять, что Вы выполняете в PostgreSQL и кстати в MySQL если указать только один столбец для группировки ошибки не будет (вот такой вот забавный MySQL)

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Да! Хорошее замечание. Буду уточнять :)

  • @chip253
    @chip253 2 ปีที่แล้ว +1

    В последнем случае поддерживаю про Left Join - всяко может быть, и по скорости лучше, т.к. связывание будет после получения результатов.
    Но во 2й задаче - сомнительно использовать union all из таблиц, в которых будет миллионы строк 😁
    Давайте больше головоломок - типа найти не более 5 заказов клиентов которые заказывали такой-то товар ...

    • @mkalalaka
      @mkalalaka 2 ปีที่แล้ว +1

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

    • @СяотестерСяомей
      @СяотестерСяомей ปีที่แล้ว

      В году 365 дней, поэтому даже за 10 лет существования проекта - там в каждой таблице будет максимум по ~36 тыс. строк. Даже если есть 10 таблиц - это максимум треть миллиона строк.

  • @ПашаКомаров-т8д
    @ПашаКомаров-т8д 2 ปีที่แล้ว +1

    очень круто! хочу ещё больше sql

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Будет!

  • @olzh6285
    @olzh6285 2 ปีที่แล้ว +2

    В 3 заданий наверное точнее было бы написать order_date>='2020.02.01'. Не уверен, но вроде в задании эти дни указаны включительно. А если это так то есть минимальны шанс вывести не правильный результат

    • @СяотестерСяомей
      @СяотестерСяомей ปีที่แล้ว

      В задаче написано between, поэтому если подразумевается between в смысле синтаксиса SQL - то да, именно так, так как он(оператор) включает границы диапазона значений в выборку. Если же значение подразумевается в "человеческом" смысле - то тогда не факт, что значения границы выборки входят в искомый диапазон. По хорошему - в нормальном ТЗ такие вещи следует точно конкретизировать, а если есть сомнения - то лучше уточнить у заказчика такие моменты перед тем как собственно писать код и сдавать работу, так как именно из за вот таких "маленьких неоднозначностей в ТЗ" порой случаются серьезные и дорогостоящие ошибки и факапы.

  • @erboljunusmamatov32
    @erboljunusmamatov32 2 ปีที่แล้ว +1

    обожаю твои разборы задач

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Ура! Это очень радует :) буду снимать ещё

    • @erboljunusmamatov32
      @erboljunusmamatov32 2 ปีที่แล้ว

      @@Noukash мне ответил сам Андрей😨😱

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      @@erboljunusmamatov32 Я много кому отвечаю)) Стараюсь по возможности ответить на большую часть, но не всегда успеваю ответить на все :)

  • @ivani3237
    @ivani3237 2 ปีที่แล้ว +3

    для аналитиков еще может и пойдет (им можно и по именам группировать) , но для data девелоперов это легкий уровень

    • @mkalalaka
      @mkalalaka 2 ปีที่แล้ว

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

  • @mshparber
    @mshparber 2 ปีที่แล้ว +3

    Спасибо. А где можно разместить такие задачи для своих кандидатов, так, чтобы они могли писать SQL и видеть результаты?

  • @vovkajyk5345
    @vovkajyk5345 2 ปีที่แล้ว +3

    А разве в третьей задаче в условии WHERE не должна стоять функция between? в отличии от > и = и

    • @Noukash
      @Noukash  2 ปีที่แล้ว +1

      Да, конечно between топ

  • @Myth1987
    @Myth1987 ปีที่แล้ว

    Круто. Можно ссылки на задачи?

  • @_pepsi_9361
    @_pepsi_9361 2 ปีที่แล้ว +1

    Ты ТОП

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Спасибо!

  • @СергейЛюбимов-у3ф
    @СергейЛюбимов-у3ф 2 ปีที่แล้ว

    Здравствуйте, Андрей, спасибо за видео. Подскажите, пожалуйста, хороший курс по базам данных. С основами я знаком, хотелось бы углубить знания

  • @javidhesenov7611
    @javidhesenov7611 2 ปีที่แล้ว

    spasibo, ti skazal chto samiy posledniy eto samiy trudniy. No dlya menya perviy bil samim trudnom. ))))

    • @Noukash
      @Noukash  2 ปีที่แล้ว +1

      Ого! Интересно) не ожидал, что он будет труднее 3! Принял

    • @javidhesenov7611
      @javidhesenov7611 2 ปีที่แล้ว

      @@Noukash a mojna sprosit voprosi? da u menya zadachi kotorie nu moqu reshat ))) Tolka 2 budet

  • @akofanov
    @akofanov 2 ปีที่แล้ว +1

    В третьем примере >= и

  • @sweet-lana163
    @sweet-lana163 2 ปีที่แล้ว +1

    Спасибо

  • @ДмитрийШум-з8б
    @ДмитрийШум-з8б 2 ปีที่แล้ว

    Добрый день. Задача №1. А почему нельзя сделать просто группировку по полям отправитель и получатель, а по дате и действию расчет минимального значения? Мы ж в рамках этой задачи должны решить, не думая на перспективу? Будет работать однозначно быстрее, чем использовать соединения таблиц. А потом уже дело техники посчитать количество записей принятых через CASE и количество общее. Или нет?

  • @CECTPAXAOC
    @CECTPAXAOC 2 ปีที่แล้ว +1

    Андрей, спасибо за разбор. Как раз сейчас прохожу sql. А поясни, плиз, если не сложно, почему для отбора самого большого заказа, ты сортируешь не просто по total_order_cost, а ставишь аггр функцию SUM(total_order_cost)? Там же просто по значениям в колонке это делается - без суммирования.

    • @Noukash
      @Noukash  2 ปีที่แล้ว +1

      Ответил в одном из соседних комментариев. В ORDER BY можно использовать или alias или выражение (например CASE WHEN). Использовать алиас с выражением не получится. Поэтому я не использую алиасы с ORDER BY чтобы не запутаться.

    • @ВикторРябов-ц3з
      @ВикторРябов-ц3з 2 ปีที่แล้ว

      вообще то в group by и order by можно вписывать номер колонки.
      Это религиозно неправильно но mysql и pgsql поддерживают эту фичу уже лет 20 как.
      что то задачи какие то слишком простые.

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      @@ВикторРябов-ц3з У меня есть видео про задачки из SQL еще одно - и там я как раз в Group by использую 1,2. А задачки да - это для новичков - используются на этапе скрининга первичного чтобы понять он вообще туда пришел или нет. Есть более сложные задачи, которые также буду разбирать

  • @ddd-h3k
    @ddd-h3k 2 ปีที่แล้ว

    Хотелось бы уточнить на какую вакансию сии "задачи"? Судя по уровню "сложности" на уборщицу протирающую столы разрабов.

  • @ВладимирБутыгин-и2к
    @ВладимирБутыгин-и2к 2 ปีที่แล้ว +6

    В последнем примере группировка по first_name в действительность дичь… я понимаю что они написали что имена уникальны, но в реальных условиях…

    • @yurim7756
      @yurim7756 2 ปีที่แล้ว

      ага, бага. Даже для "упрощения" руку сбивать нельзя.

    • @vnukov_vv
      @vnukov_vv 2 ปีที่แล้ว

      Возможно уникальность имен это этакая ловушка-маркер для неправильных решений

  • @ivanseregin4411
    @ivanseregin4411 2 ปีที่แล้ว

    Даты должны быть включительно или нет? Т.е. 2019-02-01 должна попадать в диапазон в запросе или нет?

  • @СеменСидоров-щ8с
    @СеменСидоров-щ8с 2 ปีที่แล้ว

    Привет. Конечно. Нужны примеры задач не только sql, но и питон.
    Я как начинающий аналитик... Пока не понимаю тот, минимальный уровень навыков, с которым могу ворваться в эту сферу.

  • @evgeniihookah9924
    @evgeniihookah9924 2 ปีที่แล้ว +1

    Первый лойсик загрузил 😁❤️

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Ура! Спасибо :)

  • @vvyadrincev
    @vvyadrincev 2 ปีที่แล้ว +4

    Спасибо за видео, было интересно, хоть SQL использую ограниченно, но имеется опыт преподавания практических занятий в университете.
    Финальное решение последней задачи кажется неправильным, ведь выполняется группировка по first_name, который не уникален (такого условия вроде бы не было).

    • @Noukash
      @Noukash  2 ปีที่แล้ว +1

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

  • @Anonymous_starrrr
    @Anonymous_starrrr 2 ปีที่แล้ว

    а на каком сайте вы пишете запрос в этом видео?

  • @aksisus7396
    @aksisus7396 2 ปีที่แล้ว

    Во втором примере наверное outer apply отработал качественнее

  • @Alex-hh5oe
    @Alex-hh5oe 2 ปีที่แล้ว

    Здравствуйте, а можете пояснить -а почему в первой задаче у нас в результирующей таблице всего две строчки? Там же дат гораздо больше (5-6). Или я что-то упустил. Заранее спасибо.

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Только 2 даты в которые были посланы запросы - атрибуцируем к ним

  • @ivanshelonik3979
    @ivanshelonik3979 2 ปีที่แล้ว

    Подскажите пожалуйста, как называется сайт на котором вы данные задачи решаете?

    • @Noukash
      @Noukash  2 ปีที่แล้ว +2

      Stratascratch

  • @asusloff
    @asusloff 2 ปีที่แล้ว +1

    А теперь реши задачу 2 и 3, только вместо максимального значения нужно выбрать, скажем, второе по величине. Ну это так, чтобы на Limit 1 не подсаживались.

    • @IaNoT100
      @IaNoT100 2 ปีที่แล้ว +1

      Так можно ведь оставить Limit 1, но дописать offset 2 в вашем случае?
      Извините, если предложение тупое. Только учусь

  • @alexsklemin3708
    @alexsklemin3708 2 ปีที่แล้ว +2

    А я бы посмотрел курс по SQL. Хочу наконец нормально разобраться в оконных функциях и вложенных запросах

    • @Noukash
      @Noukash  2 ปีที่แล้ว +3

      О! Я бы с удовольствием такой сделал бы ближе к концу года

    • @mkalalaka
      @mkalalaka 2 ปีที่แล้ว

      читайте Ицика Бен-Ганна и будет вам счастье

  • @user_elenak
    @user_elenak 2 ปีที่แล้ว

    Андрей, подскажите, а если в 3 задаче не делать джоин, а просто брать данные из двух табл . Выводить имя из одной, остальное - из другой, при условии, что их каст_айди - равны. Чем отличаются варианты? И почему лучше использовать одно, а не другое?

    • @mkalalaka
      @mkalalaka 2 ปีที่แล้ว

      а как вы будете брать данные из второй таблицы? отдельным запросом? все равно надо будет сопоставлять по ИД. но логика будет разорвана на два блока и это уже не СКЛ

    • @user_elenak
      @user_elenak 2 ปีที่แล้ว

      @@mkalalaka select a.name , b.adress from tableNames a, tableAdress b where a.id=b.id (К примеру, я уже не помню какие там данные)

  • @drozdoves
    @drozdoves 2 ปีที่แล้ว +5

    Задача №1: Разве datetime не подразумевает что там могут быть и данные с временной меткой? Если так, то решение не работает.
    Задача №3:
    1) Зачем учить людей плохому и группировать по имени? Это более ресурсоемко + может привести к багам.
    2) Поидее движок должен такое нормально отсеять, но я в этом не уверен на 100%(нужно смотреть explain и т.д.): Есть ли смысл джойнить таблицу юзеров со всеми ордерами, если нам нужен только один ? На больших данных такой джойн может сказаться на производительности(а может и не сказаться, нужно вникать в оптимизацию конкретного sql движка)

  • @ВиталийИнчин
    @ВиталийИнчин 2 ปีที่แล้ว

    Это все конечно круто, но в реальности count, sum и тд будут дико нагружать бд, если там большие объемы данных. Мне кажется, стоит это упомянуть и возможно рассказать про хорошую практику (создание отдельных таблиц под подобную статистику)

    • @user-ch76tcye4vvuu8
      @user-ch76tcye4vvuu8 2 ปีที่แล้ว

      Тут же задачи про то, как получить данные из уже собранных, а ни как их собирать.

    • @mkalalaka
      @mkalalaka 2 ปีที่แล้ว

      @@user-ch76tcye4vvuu8 ваш ответ не отменяет начальный запрос. как раз по собранным данным чаще всего и нужна агрегация. я для сбора скорее надо обсуждать insert, update, delete.

    • @mkalalaka
      @mkalalaka 2 ปีที่แล้ว

      угу, и поддерживать их актуальность. но перед этим неплохо бы оценить, что можно выкрутить на индексах. они хорошо помогают в запросах с агрегатами, если грамотно наложены. ну и если двигло позволяет, то можно посмотреть в сторону column store хранения данных, тогда агрегаты просто взлетают как ракета.

    • @user-ch76tcye4vvuu8
      @user-ch76tcye4vvuu8 2 ปีที่แล้ว

      @@mkalalaka Тема видео решение задач на SQL. В задачах нужно писать запрос на получение данных, а ни проектировать сбор данных.

    • @noname-bi7ve
      @noname-bi7ve 2 ปีที่แล้ว

      ну как бы это решается индексированием и партицированием таблиц, а также использованием фильтров в запросе. Никто отдельные таблицы под статистику не заводит, это бред.

  • @DimxXxka
    @DimxXxka 2 ปีที่แล้ว

    Я бы сказал ничего не поня но, но тк я не программист, но было интересно

  • @noname-bi7ve
    @noname-bi7ve 2 ปีที่แล้ว +1

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

  • @makkusu3866
    @makkusu3866 2 ปีที่แล้ว

    как называется сервис в котором ты эти квери пишешь?

    • @Noukash
      @Noukash  2 ปีที่แล้ว +1

      Stratascratch

    • @makkusu3866
      @makkusu3866 2 ปีที่แล้ว

      @@Noukash спасибо

  • @massloff
    @massloff 2 ปีที่แล้ว +1

    А почему в order by нельзя было поставить алиас?

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      В ORDER BY можно использовать или alias или выражение (например CASE WHEN). Использовать алиас с выражением не получится. Поэтому я не использую алиасы с ORDER BY чтобы не запутаться.

  • @tsv8560
    @tsv8560 2 ปีที่แล้ว

    Во второй задаче: опять же зависимость от данных. Т.е. если будет 2 даты с одним максимальным количеством, то какая из них нужно вывести (по хорошему обе, ну или уточнить например где дата больше/меньше)?

    • @errandir
      @errandir 2 ปีที่แล้ว

      Если ты не джун, от тебя ожидаются вопросы подобного рода ;)

  • @eduardmart1237
    @eduardmart1237 4 หลายเดือนก่อน

    А сколько у тебя уходит времени на подготовку одного видео?)

  • @murodmamatkarimov8849
    @murodmamatkarimov8849 2 ปีที่แล้ว

    Заметка: 3 задаче, у 2 или больших покупателей одинаковые суммы заказа (к примеру макс 275, не только у Jhon но и у Jill) то мы теряем остальных покупателей, кроме первого

    • @ВитКоммерс
      @ВитКоммерс 2 ปีที่แล้ว

      Для этого как раз нужно более универсальное решение через подзапрос с оконкой DENSE_RANK()

  • @juliatkachenko4638
    @juliatkachenko4638 2 ปีที่แล้ว +1

    👍

  • @eldarallakhverdiiev2211
    @eldarallakhverdiiev2211 2 ปีที่แล้ว

    безолаберное решение второй задачи. В случае двух дней с одинаково большим потреблением енергии просто теряется еще один день. отлично учите)))

  • @AndrewShevchuk
    @AndrewShevchuk 2 ปีที่แล้ว

    Запрос должен быть с планом выполнения.

  • @RisDeep
    @RisDeep ปีที่แล้ว

    На собеседовании спросят зачем ты это сделал, а не "чтобы просто было веселее"

  • @fotomuckraker1774
    @fotomuckraker1774 ปีที่แล้ว

    в первом задании не понимаю зачем джойнить одну и ту же таблицу?

  • @МаксВасилюк-ы3н
    @МаксВасилюк-ы3н 2 ปีที่แล้ว +4

    Закидывай пандас на сложном уровне

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Обязательно будет!

  • @MsAlexandr76
    @MsAlexandr76 2 ปีที่แล้ว

    Ещё вопрос: почему BETWEEN не подходит в последней задачи?

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Подходит конечно! Лучше бы его использовал

    • @MsAlexandr76
      @MsAlexandr76 2 ปีที่แล้ว

      @@Noukash так в чем дело? Я очень удивился, тем более в условии не сказано о граничных значениях!

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      @@MsAlexandr76 Просто использовал не его) Можно сказать ошибся. Можно было бы использовать >= и и

  • @alexanderpustota4206
    @alexanderpustota4206 ปีที่แล้ว

    А я ещё удивляюсь: что за люди вместо одного запроса делают кучу лишних ненужных джойнов)

  • @СяотестерСяомей
    @СяотестерСяомей ปีที่แล้ว

    16:50. Никогда не делайте так, как сделал этот "ментор". За подобное решение - дисквалифицировал бы соискателя нафиг. Причем сначала правильно же начал делать, а потом сделал фигню: Представьте на минутку, что есть несколько покупателей с одинаковыми первыми именами. Представили? Правильно, будет ошибка, так как разные покупатели с одинаковыми ферстнеймами будут сгруппированы в одну группу. Поэтому в данном случае - правильно как раз таки группировать по кастомер ID так как скорее всего, это внешний ключ охваченный ссылочной целостностью, ну и как минимум - даже если в таблице кастмоеров нету такого ИД - мы понимаем что это точно заказы одного и того же кастомера. А джоинт в этом случае лучше должен быть левый, а то мало ли чего, это как раз таки мысль безусловно здравая(хотя в нормальной БД - такие вещи связывают внешними ключами).

  • @zakharovcharov7921
    @zakharovcharov7921 2 ปีที่แล้ว +1

    Каждый раз, когда человек, говорящий об ИТ называет "Кремниевую долину" "Силиконовой", сразу как-то пропадает доверие... Только у меня так?

  • @compolomus9719
    @compolomus9719 2 ปีที่แล้ว

    почему не between с датой в where?

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Between действительно лучше. Можно или >=

  • @Elk1_Palki
    @Elk1_Palki 2 ปีที่แล้ว

    Было бы не плохо оптимальность каждого решения показывать.😉

    • @mkalalaka
      @mkalalaka 2 ปีที่แล้ว

      было бы, но без конкретного сервера это скорее на "поговорить". как прочитать план запроса, на что обратить внимание, где есть потенциальные узкие места и т.п.

  • @АлексейЛысюк-ь4я
    @АлексейЛысюк-ь4я 2 ปีที่แล้ว

    Прикольно. В tsql завершающая 2-й пример инструкция "limit 1" пишется как "top 1" сразу после select.
    Неужели такие простые задачи.
    Нее. Скорее это какой то предварительный этап отсева.

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Да - это на первичном скрининге. На последующих этапах они сложнее

  • @ВиталийРевенко-е9ь
    @ВиталийРевенко-е9ь 2 ปีที่แล้ว

    Программисты 1С смеются над сложностью задач amazon и facebook )

  • @MsAlexandr76
    @MsAlexandr76 2 ปีที่แล้ว

    LIMIT vs TOP в чём разница?

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Одно и тоже в разных диалектах SQL. Насколько я помню, TOP используется в SQL Server.

  • @slavax4b207
    @slavax4b207 2 ปีที่แล้ว

    Хм, как по мне задачи и на 1/3 не близки по сложности к тому что встречаешь обычно в работе

  • @nukeMoscow
    @nukeMoscow 2 ปีที่แล้ว

    Это наверно на джуна?

  • @ЯрославФамилия-н9ю
    @ЯрославФамилия-н9ю 2 ปีที่แล้ว

    В последней задаче если имена повторяются у тебя сложатся суммы.

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Да - но в задаче указано и я это проговорил, что для простоты имена уникальны. Так можно было бы оставить группировку по айди и приджойнить имя

  • @БорисАлиханов-у4з
    @БорисАлиханов-у4з 2 ปีที่แล้ว

    Школьникам будет интересно

  • @romanpritkov1107
    @romanpritkov1107 2 ปีที่แล้ว

    Там в 1й задаче иногда 0/0 будет деление

  • @nightblure
    @nightblure 2 ปีที่แล้ว

    что это за сайт?

    • @Noukash
      @Noukash  2 ปีที่แล้ว +2

      Stratascratch

  • @neemolog
    @neemolog 2 ปีที่แล้ว

    Чувак ты путаешь соединение join и обьединение union

  • @Fredflinstone0901
    @Fredflinstone0901 2 ปีที่แล้ว

    Ниче себе, Пол Дано выучил русский и ведёт канал про айти?

    • @Noukash
      @Noukash  2 ปีที่แล้ว +1

      Бетмен мало денег собрал, переквалифицировался

  • @vlad8430
    @vlad8430 2 ปีที่แล้ว +1

    Это на trainee аналитика что ли задачи? Примитивные вещи, единственный ньюанс (актуальный для меня), придется поломать голову как это делается на диалекте использованных БД (все же ClickHouse попривычнее).

  • @isdown78
    @isdown78 2 ปีที่แล้ว

    Плохое решение для первой задачи, так как идёт два прохода по таблице. Лучше бы было:
    select date, sum(action)/count(*) from (select user_id_sender, user_id_reciver, min(date) date, min(case when action = 'accepted' then 1 else 0 end) as action from fb_friend_request group by user_id_sender, user_id_reciver) group by date order by date
    Я ораклист, поэтому приведение типов додумайте сами. :)
    Плохое решение для третьей задачи:
    1. Имена тянутся для каждой записи, даже тех, которые нам не нужны. Лишняя нагрузка на вторую таблицу. Надо считать топа, а потом по id подтягивать его имя
    2. Если есть тёзки, но разные покупатели, то они будут просуммированы.

  • @DostoevskyFedor1821
    @DostoevskyFedor1821 2 ปีที่แล้ว +1

    это задачи для кого? мне кажется это легко даже для джунов (:

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Согласен они простоватые, но в лайв режиме на собесах спрашивают похожее - не берут сильно сложные. В следующий раз возьму посложнее)

    • @DostoevskyFedor1821
      @DostoevskyFedor1821 2 ปีที่แล้ว

      @@Noukash было бы реально интересно посмотреть что-нибудь посложней с партишинами например

    • @Noukash
      @Noukash  2 ปีที่แล้ว +1

      @@DostoevskyFedor1821 Следующее видео про SQL возьму задачи от туда, но хард тогда)

    • @DostoevskyFedor1821
      @DostoevskyFedor1821 2 ปีที่แล้ว

      @@Noukash вот это по нашему! ждемс тогда (:

  • @-EgoSerg-
    @-EgoSerg- 2 ปีที่แล้ว

    У тебя не оптимальное решение с точки зрения перформанса.
    Зачем ты джойниш таблицу, для все строк а потом эти строки пропускаешь. Проще вытащить одну запись в подзапрос, и уже потом заджойнить. Так будет работать быстрей

    • @-EgoSerg-
      @-EgoSerg- 2 ปีที่แล้ว

      А если еще и дальше углубиться. То в последнем примере. Зря ты на дату забил.
      А что если там данных будет за 20 лет? Ты и для них будешь проводить группировки, джойны и все вычисления?
      Запрос получится тяжёлым.
      Вот что нужно сделать.
      1. Отфильтровать ордера по дате.
      2. Найти максимальное значение с ценой. И сделать это подзапросом.
      3. Заджойнить таблицу юзеров
      4. И вывести результат

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Согласен с комментариями! Я вообще не оптимизировал запросы с точки зрения перформанса и не учитывал крайние случаи/ошибки в данных. Для меня было важно показать основной принцип вычислений. Но все комментарии 100% по делу

  • @nkz1386
    @nkz1386 ปีที่แล้ว

    Какие-то дико простые задачи

  • @portusdelphini
    @portusdelphini 10 หลายเดือนก่อน

    Зачем писать, что компания в какой-то дыре запрещена? Всем насрать на это

  • @Jdivanchik
    @Jdivanchik 2 ปีที่แล้ว

    как зарплату из заграницы получать то?)))

  • @MuTcyXuDe
    @MuTcyXuDe 2 ปีที่แล้ว

    Почему так изево...

  • @alexalexfff
    @alexalexfff 2 ปีที่แล้ว

    Какие-то слишком простые задачи

  • @MarkLevinson2
    @MarkLevinson2 2 ปีที่แล้ว

    Легчайшие задачи, причём решить их можно без ваших "ср@ных" Джойнов

    • @rubinroterstern
      @rubinroterstern 2 ปีที่แล้ว +1

      Пришлите сюда решение первой задачи без left join

    • @MarkLevinson2
      @MarkLevinson2 2 ปีที่แล้ว

      @@rubinroterstern зачем пересылать, посмотри внимательно на решение других пользователей в этом же видео, там есть решение без двойнов. Джойны вообще в 90% случаях не нужны

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Что не так с джойнами?)

    • @rubinroterstern
      @rubinroterstern 2 ปีที่แล้ว

      @@Noukash это, походу дела, религиозный вопрос.

    • @Noukash
      @Noukash  2 ปีที่แล้ว +1

      @@rubinroterstern Да - наверное его просто джойн покусал)

  • @Chaevnicher
    @Chaevnicher 2 ปีที่แล้ว

    Какие-то совсем уж каличные задачки)) такое даже не интересно решать

  • @kupuewkustream1509
    @kupuewkustream1509 2 ปีที่แล้ว

    Чтож ты зажатый сидишь, постоянно крест руками делаешь, аж неприятно смотреть

    • @Noukash
      @Noukash  2 ปีที่แล้ว

      Так не смотри!

    • @kupuewkustream1509
      @kupuewkustream1509 2 ปีที่แล้ว

      @@Noukash Посмотрел уже, поздно!

  • @АлександрГоловко-м8п
    @АлександрГоловко-м8п 2 ปีที่แล้ว

    Работа на за границу при ведении боевых действий расценивается как предательство

  • @kengupich
    @kengupich 2 ปีที่แล้ว

    так, попробую писать решения до твоего варианта))
    1)
    SELECT t1.date, COUNT(t2.action) / COUNT(t1.action) percentage_acceptance
    FROM fb_friend_requests t1
    LEFT JOIN fb_friend_requests t2
    ON t1.user_id_sender = t2.user_id_sender
    AND t1.user_id_receiver = t2.user_id_receiver
    AND t1.action != t2.action
    WHERE t1.action = 'sent'
    GROUP BY t1.date
    upd: Спасибо за лайфхак с 1.0. Раньше игрался с функциями
    2)
    WITH cte AS (
    SELECT date, SUM(consumption) sumConsumption
    FROM(
    SELECT * FROM fb_eu_energy
    UNION ALL
    SELECT * FROM fb_asia_energy
    UNION ALL
    SELECT * FROM fb_na_energy
    ) t1
    GROUP BY date
    )
    SELECT *
    FROM cte
    WHERE sumConsumption = ( SELECT MAX(sumConsumption) FROM cte )
    upd: Важно не через лимит идти, мы же так можем данные потерять
    3)
    WITH cte AS (
    SELECT order_date, t1.id, first_name, COUNT(*) countOfOrders, SUM(total_order_cost) total_order_cost
    FROM customers t1
    JOIN orders t2
    ON t1.id = t2.cust_id
    WHERE order_date BETWEEN '2019-02-01' AND '2019-05-01'
    GROUP BY order_date, t1.id, first_name
    )
    SELECT first_name, total_order_cost, order_date
    FROM cte t1
    WHERE countOfOrders = ( SELECT MAX(countOfOrders) FROM cte )
    upd: Тут тоже самое, можем данные потерять, опасно через лимит решать такие задачи