А вот и новый оптимизированный баз данных тред, в котором мы -Выслушиваем, почему в шапке по-прежнему отсутствует инфа для вкативания -Разбираемся, почему PostgreSQL - не Oracle -Пытаемся понять, зачем нужен Тырпрайс, если есть бесплатный опенсурс -Обсуждаем, какие новые тенденции хранения данных появляются в современном цифровом обещстве -Решаем всем тредом лабы для заплутавших студентов и задачки с sql-ex для тех, у кого завтра ПЕРВОЕ собеседование -Анализируем, как работает поиск вконтакте -Игнорируем конкаренси-шизика, не понимающего, зачем базы данных нужны -И просто хорошо проводим время, обсирая чужой код, не раскрывая, как писать правильно
Гайз, такая ситуация -- не могу выбрать литературу для вкатывания в sql(понадобится мне по работе в будущем) Может кто-нибудь рассказать свою историю успеха и кто как вообще учился этому ремеслу? (3 курс-кун)
Можно ли найти работу после самостоятельного изучения sql, не имея в о по специальности программирование и даже по смежной (в/о гуманитарное). Как относятся к таким людям?
>>1638710 (OP) Братаны, нужен адекватный механизм для удаления устаревших данных из БД. Можно конечно ставить что-то типа DateField и на сервере каждые n минут проверять разницу между текущей датой и выставленной, если она превысила порог в скажем 30 дней, мы удаляем запись. Но что если сервер ляжет и его время сбросится в ебеня? Как вообще реализуют удаление устаревших данных в БД (вне зависимости, реляционная это база или noSQL)?
> сервер ляжет и его время сбросится в ебеня Тогда отсчитывать разницу не от текущей, а от последней добавленной, например, но это при условии, что новых записей с неправильным временем не появляется. А если появляются, то ничего не поделать и придётся при каждом инсерте проверять триггером, что нету более новых записей.
>>1640580 Если ты о sql курсиках - каким-то джуном дата аналитиком можно. И то, нужны еще доп. знания. Если прорываться куда-то в банк, телеком то нужно еще немного подчитать о екселе, т.к. без него увы никуда.И хотя бы одном аналитическом пакете (чаще всего Power BI)- важно знать что такие есть и зачем они, остальное - наживное. Типа когда тебя на собесе спросят знаком ли ты с какой-то приблудой, ты не обосрешься, а скажешь типа: - "Немного опыта, знаю что используется для построения отчётности о количестве собраного говна в секунду" И обычно этого достаточно для мимоджуна во всякие полулегальные банки. Если прорываться в айти - то хоть немного подчитать о джире, гугл таблицах. А главное быть в чуть курсе стрима из которого продукт конторы куда ты собеседуешься. мимо-вкатившийся
> Но что если сервер ляжет и его время сбросится в ебеня?
Атомный источник, ntp сервер, прописанная в поттердэ синхронизация в момент запуска, всё это в противоядерном бункере в противошоковой камере на подвесах.
>>1638710 (OP) помогите плес написать (это изи, я знаю, прост нюфаг) ⦁ сосчитать количество сольных артистов, чь альбомы продались тиражом более 1000 (вывести только число). ⦁ отобразить всех исполнителей, в списке жанров которого есть “pop” in it (без дубликатов; необходимые поля: artist, genre). ⦁ выбрать Group leaders (name + surname, date of birth, group name, group description) и их лучшие продаваемые альбомы в 2020 году и количество их песен. ⦁ найти название альбома второго по рейтингу ⦁ добавить песню “World” с genre ID 8 в album ID 2. ⦁ заменить национальность лидера группы с ID 42 на значение: ID 14.
>>1642509 Вы заебали студенты ебанные, хоть бы блять начал решать для приличия, и спросил что непончтно. Иди нахуй, чтоб тебя отчислили ленивый уебок. Мы не твоя личная армия.
>>1638710 (OP) сап, ночной обращаюсь ко всем бывалым анонам. какую nosql субд выбрать, при условии, что чаще всего при работе с бд будут выполняться много операций чтения и записи МАЛЕНЬКИХ данных (размером ~10-30 байт)? пока что в гугле нихуя не нашел, но может вопрос будет для кого-то супер очевидным. добра.
Уже ничем, попав в интырпрайз из монги усиленно переделывают обычную реляционную СУБД - уже добавили транзакции, следом и статичная схема появится, а там уже и до нормальных форм недалеко.
Как поступать если джионишь по полям с разным типом данных? Какой бескпартис? Просто если в джоине конвертить смотрится совсем уж уродливо.
Вот например у меня Duble, нужно сделать джоин к varchar, так мне приходится 2 раза кастить(сначало в инт, чтоб убрать нули, потом уже в текст). Но наверное есть способы получше?
В рот ебал эти олимпиадная задачки на sql-ex. В прикрепе задание и таблицы текущей схемы. https://pastebin.com/tkGYpBgF - здесь решение, которое хуй знает как валится. Хуже всего что на этом дремучем sql-ex при прхождении запроса на второй и третьей базе не показывают результирующие данные, в то время как на всех нормальных сервисах типо leetcode'a и прочих, всегда есть какой-то референс.
>>1643937 Чем дальше в лес, тем глубже трясина. https://pastebin.com/1Eh494wV В этот раз заговнокодил на славу, с кучей соединений строк и их реверсом, на второй базе выдает меньше на 16 чем нужно, до коле?
>>1638710 (OP) Есть какой-то сборник задач по SQL? Желательно онлайн. Ещё лучше с ответами. Хочу руку набить на запросах. Например, есть две таблицы, такие-то поля, такие-то данные сделай такую выборку, сделай такую же, но отсортируй данные по дате. Сейчас я спокойно пишу запросы там где нужно, но с гуглом. Надо практики побольше, а сам я ничего особенного из головы придумать не могу.
>>1643937 >на этом дремучем sql-ex при прхождении запроса на второй и третьей базе не показывают результирующие данные В факе даже написано почему - чтобы люди разбирались с сутью задачи, а не подгоняли ответы.
>>1643518 Джон - просто объединение. Объединяешь с помощью ключа - того, что есть в любом коде. Объединение может быть тоже разное Правое, левое, классическое.
Двач, сегодня нужно было срочно по-быстрому преобразовать емейлы уровня ivan.petrov@domain.com в фамилии типа Petrov. Мейлы из списка только двух видов: ivan.petrov@domain.com и, допустим, ivan.g.petrov@domain.com (когда ящики имя.фамилия заняты, то вставляют ещё букву отчества). Потом фамилию в этом виде при определённых условиях нужно было добавлять к ещё одной строке, но суть в том, что само преобразование получилось очень громоздким.
Я вспоминал и искал все подряд строковые функции и лепил, лишь бы быстрее доделать, и оно таки заработало. А потом представил ситуацию, что если домен будет нетипичным, или у человека будет двойная фамилия, в общем, всё опять нагромоздится, или пойдёт по пизде. Приложил этот кусок запроса с прикрученными тестовыми данными. Анон, можешь пояснить за то, как корректно юзать строковые функции, и показать, как это нужно было делать на самом деле?
declare @t as table ( row int ,fio varchar(255) ) insert into @t values (1,'ivan.g.petrov@domain.com') ,(2,'ivan.petrov@domain.com') ,(3,'ivan.petrov@domain.net') -- нетипичный домен ,(4,'ivan.g.petrov.vodkin@domain.com') --нетипичный емейл --SELECT * FROM @t
SELECT fio as [login] ,STUFF(
IIF( LEN(REPLACE([fio],'@domain.com','')) - LEN(REPLACE(REPLACE([fio],'@domain.com',''),'.', ''))=1 --если в логине одна точка, например ivan.ivanov@domain.com ,REPLACE(STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)),''),'@domain.com','') -- удаляем всё после первой точки, и реплейсом добиваем @domain.com ,REPLACE(STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)+1),''),'@domain.com','')) -- удаляем всё после второй точки, это на случай, если в логине две точки, например ivan.i.ivanov@domain.com
, 1, 1, UPPER(LEFT(IIF(LEN(REPLACE([fio],'@domain.com','')) - LEN(replace(REPLACE([fio],'@domain.com',''),'.', ''))=1 --если в логине одна точка, например ivan.ivanov@domain.com
,REPLACE(STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)),''),'@domain.com','') -- удаляем всё после первой точки, и реплейсом добиваем @domain.com ,REPLACE(STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)+1),''),'@domain.com','')) -- удаляем всё после второй точки, это на случай, если в логине две точки, например ivan.i.ivanov@domain.com
,1))) as [last name]
FROM @t
Строковые функции
Аноним02/04/20 Чтв 02:22:54№164836851
>>1648362 Попытка отвязаться от почтового домена и двойной фамилии нагромождает запрос ещё сильнее, а заменить регистр второй части двойной фамилии мне уже не удаётся.
declare @t as table ( row int ,fio varchar(255) ) insert into @t values (1,'ivan.g.petrov@domain.com') ,(2,'ivan.petrov@domain.com') ,(3,'ivan.petrov@domain.net') -- нетипичный домен ,(4,'ivan.g.petrov.vodkin@domain.com') --нетипичный емейл --SELECT * FROM @t
SELECT fio as [login] ,LEFT( STUFF(
CASE WHEN LEN(LEFT([fio],CHARINDEX('@',[fio],1)-1)) - LEN(REPLACE(LEFT([fio],CHARINDEX('@',[fio],1)-1),'.', ''))=1 THEN STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)),'') WHEN LEN(LEFT([fio],CHARINDEX('@',[fio],1)-1)) - LEN(REPLACE(LEFT([fio],CHARINDEX('@',[fio],1)-1),'.', ''))=2 THEN STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)+1),'') WHEN LEN(LEFT([fio],CHARINDEX('@',[fio],1)-1)) - LEN(REPLACE(LEFT([fio],CHARINDEX('@',[fio],1)-1),'.', ''))=3 THEN REPLACE(STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)+2),''),'.','-') END , 1, 1, UPPER( LEFT( CASE WHEN LEN(LEFT([fio],CHARINDEX('@',[fio],1)-1)) - LEN(REPLACE(LEFT([fio],CHARINDEX('@',[fio],1)-1),'.', ''))=1 THEN STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)),'') WHEN LEN(LEFT([fio],CHARINDEX('@',[fio],1)-1)) - LEN(REPLACE(LEFT([fio],CHARINDEX('@',[fio],1)-1),'.', ''))=2 THEN STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)+1),'') WHEN LEN(LEFT([fio],CHARINDEX('@',[fio],1)-1)) - LEN(REPLACE(LEFT([fio],CHARINDEX('@',[fio],1)-1),'.', ''))=3 THEN REPLACE(STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)+2),''),'.','-') END ,1))) ,CHARINDEX('@',
STUFF(
CASE WHEN LEN(LEFT([fio],CHARINDEX('@',[fio],1)-1)) - LEN(REPLACE(LEFT([fio],CHARINDEX('@',[fio],1)-1),'.', ''))=1 THEN STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)),'') WHEN LEN(LEFT([fio],CHARINDEX('@',[fio],1)-1)) - LEN(REPLACE(LEFT([fio],CHARINDEX('@',[fio],1)-1),'.', ''))=2 THEN STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)+1),'') WHEN LEN(LEFT([fio],CHARINDEX('@',[fio],1)-1)) - LEN(REPLACE(LEFT([fio],CHARINDEX('@',[fio],1)-1),'.', ''))=3 THEN STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)+2),'') END , 1, 1, UPPER(LEFT(CASE WHEN LEN(LEFT([fio],CHARINDEX('@',[fio],1)-1)) - LEN(REPLACE(LEFT([fio],CHARINDEX('@',[fio],1)-1),'.', ''))=1 THEN STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)),'') WHEN LEN(LEFT([fio],CHARINDEX('@',[fio],1)-1)) - LEN(REPLACE(LEFT([fio],CHARINDEX('@',[fio],1)-1),'.', ''))=2 THEN STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)+1),'') WHEN LEN(LEFT([fio],CHARINDEX('@',[fio],1)-1)) - LEN(REPLACE(LEFT([fio],CHARINDEX('@',[fio],1)-1),'.', ''))=3 THEN REPLACE(STUFF([fio], 1,CHARINDEX('.',[fio],CHARINDEX('.',[fio],0)+2),''),'.','-') END ,1)))
Приветствую, двощане вопрос следующего характера: существует Data Grip (предположу что это СУБД от jetbrains) Друг накатал там пару таблиц в полноценную базу, скинул архив на облако, я скачал а теперь выяснил, что не могу "открыть" папку как проект точнее могу но потом на стадии визуацизации таблиц вижу говно В теории разбираюсь очень неочень, если пишу не туда пошлите куда надо пж
Товарищи, перевели в новый проект, там юзают Oracle. Ранее работал с MS SQL, чутка с Postgres и Mysql. Есть какой-то материал для быстро входа в Оракл? Я понимаю что основные концепты остаются те же, но есть ведь нюансы. Особенно интересует вопрос взаимодействие с БД, администрирование, какие тулы есть, каким клиентом лучше пользоваться и структура СУБД как таковой.
>>1649178 У меня оракл на соседнем проекте, иногда приходится с ним взаимодействовать. У меня срака перманентно горит из-за отсутствия стандартных функцией скуля(банально TOP). Взаимодействие через Oracle SQL Developer( ну тебе там местные ораклиытсы должны пояснить за это говно).
>>1648998 в общем скажу так. я смог открыть ее и могу например визуализировать таблицы, но при попытке выполнить любой тест запрос (селект какой-нибудь например) получая ошибку в ебало
>>1649178 Не слушай того неосилятора, у оракла есть все, что есть в ANSI. PL/SQL developer тебе будет лучше, как новичку, но нужно будет настраивать клиент, в инете инфы полно. Насколько быстрый и глубокий вкат ты хочешь? Можешь гуглить transact top oracle, а можешь посмотреть часов 45 лекций Игоря Мирончика, выбор за тобой.
>>1650628 Скорее всего, настоящий ID мы не видим, и он, да, уникальный. Но кроме него есть ID борды и номер сообщения, уникальный в разрезе одной борды и инкрементящийся каким-нибудь триггером, типа post_nomer := select max(post_nomer) + 1 from posty where borda_id = :borda_id;
>>1650634 Это получается на каждый новый пост вся таблица с постами просматривается и ищется самый большой номер поста, не жирная операция на практике?
Где почитать о нормализации БД? Статьи, на которые натыкаюсь содержат овердохуя инфы об этих нормальных формах, приправленной линалом и матаном Где сказано о практическом применении нормализации?
>>1650927 Любое хранилище с несколькими тысячами справочников и сиквенсами на каждый сейчас в голос проорали. Ты серьезно? Ты думаешь, что на каждую из, пускай, сотни, досок сделать сиквенс - это затратно?
>>1638710 (OP) Как прокачать знания в базах данных? Все эти уровни изоляции транзакций, написание сложных SQL запросов, тюнинг SQL запросов, индексы и как их правильно создавать, администрирование и тюнинг СУБД.
Почти для всех вопросов "что почитать по базам данных, индексам и т.д." есть один универсальный ответ - книга Томас Кайт "Oracle для профессионалов". Качаешь, читаешь те главы, которые тебе нужны/кажутся интересными. При необходимости возвращаешься и перечитываешь/смотришь видосы на тытрубе.
Сразу ответ на вопрос "но книга же по ораклу, а у меня postgresql/mysql/mssqlserver" - у всех самых популярных бд почти идентичный набор функционала. Знание того же оракла дает понимание, что можно сделать в любой другой субд, детали нагуглить не проблема.
Кстати, oracle для docker тоже есть. Адекватные и релевантные знания по администрированию/тюнингу/уровням изоляции и возникающим с ними проблемам приобретаются только опытным путём в работе. Но теория всегда не помешает.
>>1653876 Ну типо да, ты такой джоинишь, джоинишь, а там хуяк NULL
tabl1.pole=1 >>>>>>>>>>> tabl2.pole=1 tabl1.pole=2 >>>>>>>>>>> tabl2.pole=2 ....... tabl1.pole=1 >>>>>>>>>>> tabl2.pole=нет такого.... И тут скуль такой: Эсукабля, чо это такое, пошёл нахуй! И выкидывает строчку. А если ты ему слева\справа хук ебашишь, то он не выкидывает, говорит , Я ВСЁ ПОНЯЛ и добавляет её в результирующий набор.
Не знаю туда ли зашел. Но проблемы в майрософт access. Создаю таблицы и пытаюсь их связать в "схеме данных". Связываю пункт с типом данных "счетчик" (пик1), он одинаков в нескольких таблицах. Когда связываю пик2, то ошибка пик3 происходит. Пункты эти одинаковы во всех таблицах, с одинаковыми параметрами. Пробовал связывать как до заполнения и любого вмешательства, так и после - результат пик3 всегда.
Хотя есть одно но, если я уберу галки "каскадное обновление связанных полей", и "каскадное удаление связанных полей", оставив только "обеспечение целостности данных", то получается создать связь, но мне те галки нужны. Что делать?
>>1654685 > Тип данных проверь Проверил. Везде как на пикрил. Тип "счетчик", длинное целое, последовательное. > не лезь дебил, зачем тебе этот ассес? По учебе надо именно в нем делать
>>1655319 Да это параша гавно мамонта, там не кода, не инструментов, нихуя нет, какой-то костыль уровня 1с. Попробуй не через меню, а запросом сделать, оно должно понимать sql.
>>1655039 Тебе надо развернуть данные? То есть, например, у него channel есть и Instagram, и Twitter - надо сделать в результате запроса два столбца? Типа Id1 Instagram Id1 Twitter -> Id1 Instagram Twitter
>>1655339 >>1655039 Вот как то так, но это tsql, для оракла надо будет поправить.
Немного не ясна задача, предположу что: -первые две строчки без изменений -если конвертед 1, иначе 0 -условия для клика -только инстаграм -только ифон
SELECT customer_user_id, country_code, iif([event_name]=1,1,0), CASE WHEN attributed_touch_type=click THEN 0 WHEN attributed_touch_type=impression THEN 1 ELSE 2 END, cahnnel, device_type FROM dbo.govno WHERE channel='instagram' and device_type='Iphone'
Как вы запоминаете это? Серьезно. Я учил неделю назад операторы, прорешал задачи (успешно), сегодня открыл - все словно с нуля, позабыл все эти слова и операторы. Вспомнилось, конечно, но без напоминаний - ноль.
Что-то половина вопросов в тхреде от студентов, которые получив ответ даже спасибо не скажут, или сьебывают просто запостив свой покак. Предлагаю более не отвечать этим пидорам.
>>1655344 Я хотел из 4 строк получить одну строку. Учитывая что юзеров много и у каждого такой набор параметров о них как на скрине, эти их кучи строк хочу в одну склеить, заменив эти их "триалы/конверты" и прочее на отдельные столбцы с 0(не было такого действия) / 1(было действие). Как-то так. >>1655341 Скорее свернуть надо, сделав и N строк о юзере одну строку с кучей столбцов. Спасибо, почитаю про эти штуки. >>1655342 Немного не подходит.
Вот такой код сейчас сделал - https://pastebin.com/nvXKEQzg В результате пик 1 из пика 2 получается. Хотя пытаюсть получить строку вида: "NL04XU2GiATNXRaQSZ3...." | "iPhone 8 Plus" | "CA" | 1 | 1 | 1 | 2 | "female"
>>1656583 > Проблема в том, что много хардкодить надо Это да, но набор столбцов не окончательный, сейчас пытаюсь найти какие-то зависимости и выбрать нужные мне данные. Спасибо, антош, буду пробовать.
Работаю ETL разрабом, 170 тыщ на руки в ДС. 29 лет Стек - sql server,teradata Ну и SSIS,Pentaho и прочая залупа Игогда переписываю или пишу процедуры и прочую хуету
Куда двигаться дальше - хз
Как выбраться из говна, пойти в HADOOP и начать учить Джаву...
В таблице есть одинаковые строки с разными ИД. Скажем есть ИД 2 и ИД 3, в рамках этих ИД есть одинаковые строки отличающиеся только ИД, так же есть много других строк\ид, которые не повторяются, пересечения только в рамках строк у которых ИД 2 и 3. Соотвественно мне нужны строки с ИД 2, которых нет в ИД 3. Вроде как просто решается подзапросом, но какой-то топорный метод, нельзя ли что-нибудь поизящней с OUTER JOIN прикрутить?
>>1656925 Ну это тоже говно какое-то. Есть же наверное более изящный способ через intersect какой-нибудь. Смотрим пересечение ИД 2 и 3, а потом выбрасываем их. В таблице есть уникальное поле с ключем, т.е идентифицировать уникальную запись можно, нужно только найти общие элементы.
>>1656855 select имя, поле1, поле2, поле3 from dbo.govno group by имя, поле1, поле2, поле3 having count(case when id = 2 then 1 end) > 0 and count(case when id = 3 then 1 end) = 0
Я ещё раз повторю свой вопрос: как вы это запоминаете? Бывает ли так , что забыли простейший оператор, забыли, какие кавычки пишутся, как вчера решили задачи и т д?
>>1657997 Вообще ты не учел главного. Sql планировался как язык для домохозяек менеджеров, потому почти все его конструкции очень логично звучат и так же логично переводятся на родной тебе язык. Это касается как и принципа работы, так и принципа вызова/написания этих конструкций.
Ты же не используешь каждый день все слова из своего лексикона, но когда встречаешь - понимаешь, что знаешь это слово.
>>1658221 А что не так? Ну серьезно. With - с. Такой таблицы нет, теперь будто бы с ней в схеме. Over - над. Если бы ты смотрел аналитические функции плотнее, то вместе с partition(сиречь, группировкой, частью) и range/rows beetween все очень просто и интуитивно понятно - операция над диапазоном. Partition - та же часть - в контексте деления таблиц тоже очень простая формулировка.
Как из таблички на 2 поля amount (float), inserted (datetime) вытащить сумму amount за период от/до, но не простой, а разбитый на N частей?
Юзкейс - интерфейс дающий возможность посмотреть amount за произвольный период с произвольной разбивкой. Основные варики: каждый месяц в году, каждую неделю в году, каждый день в месяце, каждый день в неделе, каждый день в две недели, каждые 12 часов в неделе, каждый час в день, каждые два часа в день и т.д.
Привет всем. У меня есть некий рест, который должен отдавать только изменения в базе данных по запросу пользователя. Что то вроде long pooling или вебхуков. Мне кажется что я делаю велосипеды, когда навешиваю на бд триггеры или каждую минуту отправляю селекты. Для этого существует ORM или это как-то по-другому проще можно сделать? Типа контроля версий бд?
>>1659553 Эм, ну пользователь спрашивает отдаешь ему все данные старше 5 часов например, и обновляешь переменную, чтоб в следующем запросе показало только то что обновилось с прошлого.
>>1659205 Я хз, но звучит как дохуя кода. Сначало тянем общие данные за период, а потом в зависимости от потребности режем их. Соответсвенно на каждую фракцию своя обработка, процедура на вход принимает период и фракцию, отдает результат.
>>1659553 А как эти данные меняются? Что мешает тебе при изменении данных, на уровне DAL создавать копию тех, что ты отдаешь пользователю и при запросе использовать её?
каждый месяц в году, select day(твоядата),sum(твоеполе) from t where year(твоядата)=&Значение пользвателя group by day(твоядата)
каждую неделю в году select wk(твоядата),sum(твоеполе) from t where year(твоядата)=&Значение пользвателя group by wk(твоядата)
каждый день в месяце select day(твоядата),sum(твоеполе) from t where year(твоядата)=&Значение пользвателя and mounth(твоядата)=&Значение пользвателя group by day(твоядата)
>>1659205 Давненько сикуль не трогал, но что мешает написать что-то наподобии SELECT bucket(inserted), SUM(amount) FROM mytable GROUP BY bucket(inserted); где bucket - функция конвертирующая дату в некоторое значение для последующей группировки (для годов - получение года из даты)?
>>1659682 >>1659555 → Я хуево обьяснил , что мне надо наверное например, я удаляю из таблицы запись с primary key = 5, мне бин, который слушает бд отправляет post запрос с Json {table: tablename, primary key: 5, status: deleted} Или добавляю новую запись, мне «бин» шлёт Json {table: tablename, primary key: 5, status: added} Или меняю запись, мне «бин» шлёт Json {table: tablename, primary key: 5, column_changed: new_value, status: changed} Что-то типа того, только не опрашивать бд каждую %period_time, а чтобы непрерывный мониторинг был и не нагружать бд кучей запросов. И не писать велосипедов самому.
>>1660344 Звучит так будуто тебе нужно читать лог. Тоже самое что писали выше, но параллельным запросом к жрналу с таблице с логом. Хз может из журнала транзакций это тянуть, не щнаю какая там структура .
>>1660344 Это прямо то, для чего создавалась Kafka. Просто пишешь в неё нужные действия при изменении БД, а клиентами вычитываешь их. Есть готовые коннекторы к БД (для postgres, например), которые как раз занимаются тем, что пишут из коммит лога в кафку.
Нужна условная streaming аналитика. База данных должна держать определенное окно данных (FIFO). И иметь продвинутое апи, позволяющее хитрые выборки с встроенными статическими функциями.
>>1660344 Если производительность не критична, и объектов мониторинга немного, то триггеры вполне рабочий вариант, до появления логической репликации часто так и осуществляли мониторинг изменений. Иначе следует смотреть в сторону репликации-чтения логов транзакций, если требуются именно измененные данные, как написали выше. Если достаточно запроса направленного в базу, то можно попробовать подцепиться к логам базы. Но последние два варианта скорее всего не будут простыми, так как репликация в большей степени нацелена на запись в стэндбай. Полученные данные от потока репликации вероятно придется самому парсить, и отслеживать прогресс чтения логов, так как не все базы отдают информацию транзакционного лога в user-friendly формате
Такая задача. Краулятся несколько сайтов периодически, записи в базе типа site,url,type,scrape_date. Надо генерировать статистику на каждую дату - сколько для каждого сайта было записей каждого типа + разницу с прошлой датой. Сколько каждого типа добавилось, сколько уменьшилось. Вот это последнее надо как-то эффективно реализовать. Я наколхозил такое и оно работает, но медленно, и с ростом количества записей всё медленнее. Каждый раз добавляется в районе 50к записей. https://pastebin.com/2wHX7ATd
>>1664265 чтобы вычислить результат группирующей функции, нужно вычислять результат группирующей функции! блядь. куда еще быстрее?
разумеется, ты можешь попытаться оптимизировать группировку индексами, но суть от этого не меняется. поэтому, если данных действительно будет много, лучше сразу заняться предвычислениями при обновлениях.
> Это ещё откуда взялось и зачем нужно? Пишешь нам одно, а делаешь другое - так проблему сложно будет решить. То же самое. Идея такая - два подзапроса за разные даты джойнятся между собой по урлу и выбираются только те, где нет соответствия. Т.е. если такой запрос сделать на date1,date2, то будут только исчезнувшие, а если date2 date1, то только новые.
>>1664223 Что за база? План запроса есть? Железо какое? Не пробовал аггрегацию по всей таблице в разбивке по дням делать? Попробуй партиционирование по дате добавить !вместо индекса.
>>1645362 Задавай вопросы что интересно. Я тоже с гуманитарным высшим, таких перекатившихся куча, ни разу за 6 лет никто даже не пошутил об образовании и должности.
>>1667272 Интересуются ли прошлым опытом? Есть ли возможность карьеры при усердии и трудолюбии? Коллектив какой? Не бывает ли конфликтов? Дружелюбные ли? Как проходит собеседование? Тяжело ли было?
>>1667379 >Интересуются ли прошлым опытом? А о чём спрашивать если ты перекатываешься, лол. Разве что, если будут какие-то интересные моменты в твоём прошлом опыте(матан, языки) - то спросят. Запомни, когда джуна спрашивают о чём-то на собесе то это 100% чтобы прощупать теор.базу, а не чтобы завалить. Сам собеседовал 2х джунов. >Есть ли возможность карьеры при усердии и трудолюбии? Карьера в классическом понимании в IT отсутствует, здесь всё просто, если ты справляешься с задачами определённой сложности - ты растешь и похуй что ты всего пол года работаешь. Даже если прошло 3 года, а ты всё еще джун, значит ты тупой ты на своем месте. >Коллектив какой? Не бывает ли конфликтов? Дружелюбные ли? По деффолту, все очень дружелюбные, трудно быть быдлотой и кодить одновременно. Конфликты могут быть только по рабочим вопросам и то они больше смех вызывают. >Как проходит собеседование? Тяжело ли было? Первое - очень волновался, последующие на раслабоне. От тебя не требуется внимательности, просто будь собой, твои знание сами всё сделают если они есть.
>>1667515 Решил вкатываться в дата аналитику, когда это даже не было мейнстримом. Итого, сам дома выучил запросики SQL, внезапно ексель, и буквально немножечко питона, на уровне первых 10 уроковэто было очень важно, чтобы дать понять что хочу развиваться. На собесе спросили меня: 1. Обьяснить что такое join в sql и зачем он 2. формулу ВПР из екселя 3. Понимаю ли я что делает продукт компании. Да этот вопрос будут задавать часто, чтобы понять насколько ты адекват. Считай вкатывался я с 0. Мат образования - не было. Самостоятельно изучал, какие-то рандомные курсы sql и обязательно задачи на сайте sql-ex. Послушал курс по Data science на курсере. Звонил бывшей коллеге в моб.оператор, она стала нач.отдела уже, говорит что нету джунов с хорошим знанием SQL. Уже полгода не могут найти. Я в геймдеве - у нас так-же, искали джуна, приходит куча народу но с SQL мало. Кароч в первую очередь учи запросики и дерзай.
>>1667679 В 25, до этого дома сидел на двачах и игры ганял. >>1667593 Лол, как минимум чтобы была связь в данных. Типа чтобы таблицы "покупатели" и "магазины" небыли просто отдельно стоящими таблицами и между ними была логическая связьай_ди покупателя.
>>1668360 По сути - у меня не было никакой специальности когда я вкатывался. Меня засунули учиться на финансиста, но я и дня ним не проработал. И не смог бы. После выпуска 4 года откисал дома, родители выпирали работать, пошел устраиваться дата аналитиком, начитался много о этом. До этого прошел кучу курсов дома. Не прошел 2 собеса. Подтянул то на чём сыпался, и смог пролезть аналитиком в FMCG. Очень заебывали на собесах вопросом что я делал 4 года после выпуска- отвечал, что фрилансил. Это отчасти правда, но фрилансил не по аналитике.
>>1668571 Как сказать, тех ключевых областей чтобы комфортно чувствовать себя в айти и развиваться - на должном уровне или вообще, в курсе не было. Да может были какие-то интересные моменты по эконометрике но не более. Да и вуз далеко не топовый был.
>>1668566 Никогда не помнил этого. Да и сейчас не вспомню. Стараюсь забыть тот период. Когда вношу куда-то инфу о годе окончания вуза, бомблю +\- 2 года.
Привет, базаны. Не знаю, может это чисто у меня такое, но заметил такую вещь, что в большинстве случаев работа с sql это тоска смертная. Какие-то смердящие данные, лежащие в тысячах таблиц, которые создал прошлый творец, благодаря которому всё это надо джойнить и тащить. Круг задач на sql крайне узкий, при этом приходится сидеть и пердолиться с хранимыми процедурами на этом весьма посредственном синтаксисе. Куда бы я не копнул, в какую бы сторону не попытался смотреть, где есть большое присутствие SQL - везде тоска смертная. Тот же Power BI и прочие иже с ним производят впечталение какого-то переоценнённого говна вроде О СМОТРИ ТЕПЕРЬ ТУТ МОЖНО ДЕЛАТЬ ТАКИЕ ЖЕ НЕСКУЧНЫЕ ГРАФИКИ КАК В ACCESS/EXCEL В 2007 ГОДУ!
Как вы находите себе интересные задачи там? Идёте в банк и становитесь аналитиками? Или по кайфу пишете запросы, достаёте данные бэкендерам/фронтам и отдаёте их, заваривая очередной чай? Пришёл на проект, где всё очень сильно завязано на sql, с тысячей таблиц, масса из которых будто бы делалась наспех и чтобы быстрее работала. И просто тоска смертная, сидит тимлид, во всём этом разобравшийся и агитирует вникнуть и разобраться других, чтобы и дальше плодить в этом монстре триггеры и хранимые процедуры сидя на сервере 10 версии.
>>1667593 Как обычно, в it уже про это забыли, но да, для ускорения. Базовая задача - ускорение.
Обновить данные в одном файле, не затронув гору других. Хранить данные компактно связывая их по идентификаторам int, но тащить везде одинаковые и длинные строковые поля.
Решаю задачи обучающего раздела с sql-ex на PGSQL. Иногда решение не работает на PGSQL, но аналогичное работает на другой СУБД. Хотелось бы, чтобы их кто-нибудь объяснил.
Следующее решение задачи 101 проходит на MySQL, но даёт неверный результат на проверочной базе в PGSQL.
> select > code, model, color, type, price, > max(model) over w, > max(case type when 'Jet' then 1 else 0 end) over w > + max(case type when 'Matrix' then 1 else 0 end) over w > + max(case type when 'Laser' then 1 else 0 end) over w as distinct_types, > avg(price) over w > from ( > select > printer.*, > (sum(case when color = 'n' then 1 else 0 end) over (order by code)) as group_no > from > printer > ) grouped_printers > window w as (partition by group_no)
PGSQL (не проходит): select distinct country, value, attr from ( select country, attr, value, rank() over (partition by country order by value desc) as rank from classes join lateral (values ('numguns', numguns 5000), ('bore', bore 3000), ('displacement', displacement)) attrs(attr, value) on true ) q where rank = 1
MSSQL (проходит, join lateral заменен на cross apply): select distinct country, value, attr from ( select country, attr, value, rank() over (partition by country order by value desc) as rank from classes cross apply (values ('numguns', numguns 5000), ('bore', bore 3000), ('displacement', displacement)) attrs(attr, value) ) q where rank = 1
>>1669868 >а само число таблиц разве не показывает, что число видов сущностней записанных в этой базе широкое? Ну да. А что толку? Можно нескучно джойнить благодаря фантазиям архитектора, когда отчёт собирается из нескольких баз данных и это типа я эскуель девелопер?
>Потом, наверное твой текущий проект денег приносит нихуево. Ну, скажем так, он просто не сможет жить. Но даже программисты там часть звена, и даже не центровая, по сути. Просто руководство не захотело один раз потратиться на готовое решение, поэтому начали городить велосипеды, в итоге это всё превратилось в пранк, вышедший из под контроля.
>Если так скучно, поди напиши мобильный клеент к нему. Это многим нужно, но они (справедливо) считают что это слишком дорого Есть уже. Околобесполезная вещь оказалась. Потому что специфика бизнеса такая, что никому не нужно.
>>1668641 Первая зп - 600$ кажется, отдел отчётности, Киев, 2014\2015 год, но там просто череда везений была после с повышением и внезапным переходом в другой отдел. Так-что даже не буду описываить.
Смотрите какую йобу я придумал. Вот есть JSON. Можно представить что это либо строка, либо число, либо массив, либо объект (условно). А теперь берём это определение и создаем под него нормализованную схему БД - то есть по отдельной таблице для каждого типа (строка/число/массив/объект) и таблица которая маппит конкретное значение в конкретный тип. Это что получается, я изобрел монгу поверх реляционки?
>>1685978 На самом деле, в том или ином масштабе можно изобрести что угодно поверх чего угодно. Реляционная поверх key-value. Древовидная поверх реляционной. Key-value поверх таблицы из одной строки с полем TEXT. Было бы где хранить байтики и чем их обрабатывать. Жёсткий диск же как-то всё хранит в одном линейном массиве.
Поясните за изоляцию транзакций. Аномалии могут наблюдаться только при наличии > 1 запроса в транзакции, или с 1 запросом тоже может быть (например когда вложенный select или join)?
>Решаем всем тредом лабы для заплутавших студентов и задачки с sql-ex для тех, у кого завтра ПЕРВОЕ собеседование Крч есть книги, есть категории. Связь many-to-many books, categorys, books_categorys Вывести пары книга-книга у которых более 5 общих категорий
>>1695868 SELECT bc1.book_id, bc2.book_id FROM books_categories bc1, books_categories bc2 WHERE bc1.category_id = bc2.category_id AND bc1.book_id != bc2.book_id GROUP BY bc1.category_id HAVING COUNT(bc1.book_id) > 5;
Найти сначала все пары с хотя бы одной общей категорией (одинаковая категория, разные книги), затем сгруппировать по id первой книги и проверить, что записей в группе больше 5.
есть строка формата datetime и мне нужно ещё достать в пхп и вставить в строку, когда я это делаю получается что вставлена пустая строка, а как достать значения даты я не понимаю мне 12 лет я додик подскажите как с этим работать
Наверное оче часто задаваемый вопрос, но все же, по SQL вроде много курсов там всяких, видео, но с чего лучше всего начать из этого С НУЛЯ когда, реально глаза разбегаются и не поймешь что годно что нет, где будет одно и то же другими словами... Есть какие-то одобренные аноном хорошие бесплатные курсы?
>>1698228 Как только научишься писать там SELECT'ы разной сложности, рекомендую для изучения теории курс на Stepik, там будут рассмотрены вопросы проектирование схемы, нормальные формы, и мб даже транзакции.
>>1698228 >>1698231 Спасибо, на степике видел курсы, который от вышки норм? Еще разные смотрю, их так-то полно но хз какие стоят прохождения. И еще, а книги типа Грабера и других из того же гайда вон стоит читать?
>>1698245 Да, норм, я эти курсы и имел в виду. Для начала сойдут. Что изучать после этого - пусть подскажут другие аноны. Да и это зависит от того, куда ты хочешь пойти (DBA или разработка приложений).
>>1698256 Мне кажется, что для аналитика достаточно умения выполнять хитроумные SELECT'ы со всякими агрегированиями, window-функциями, рекурсивными CTE и pivot (это как раз то, чему учит весь sql-ex) , а пректирование схем их не очень касается. Но пусть лучше тебе аноны-аналитики подскажут.
>>1698262 Если я просто девелопер без знания SQL, который пишет только OLTP, мне нужно учить все эти пивоты и рекурсии? Или во всякой вебне, которую я буду писать, в основном все попроще? другой анон
>>1698263 Плюсану к этому вопросу. Сам я от нечего делать нарешал 350+ задач на sql-ex, но хотелось бы знать, насколько всё это нужно обычному бэкенд-разрабу.
>>1698268 Вообще, я общался на эту тему с одним php-разрабом, он сказал, что у них всё через ORM. А значит, никаких advanced-фич. Но один случай ничего не значит.
>>1656590 Анон, двигай в сторону data science или в кровавый интырпрайз. Выбери что нравится: на очередном собрании с заказчиками пиздеть, что данные были сырыми и всё проёбано, или что индусы опять нахуярили ебанины, и ваш отдел качества опять проебал все сроки. Но уже за 200-300 тыщ в секунду.
>>1642509 В чем сделана схема на скрине? Искал средство визуального построение схем БД, и чтото не нашлось годного. Есть красивый https://www.dbdesigner.net но он платный. Что посоветуете?
>SQL is one of the world's most fantastically moronic language. It is a language of ad-hoc-ness; the least structured; a oneliner sequence of awkwardness and inflexibility.
>>1638710 (OP) Redis и Postgres работают через сокеты, мне вот интересно: их обычно ставят на том же серваке или относят на другой удаленный серв? Просто хуячить дополнительный HTTP-request к стороннему ресурсу это пиздец в плане быстродействия Так кто-то делает?
>>1700595 >>1700594 Есть у меня 2 проекта: бот для телеги и веб-кроулер (пока тестировал их только на своей машине в localhost). В обоих юзается Postgres а в одном еще и Redis (для очередей). Мне же нет никакого смысла для таких небольших проджектов хуярить БД на отдельном ресурсе? Лучше на тот же сервак залить?
Что делать с перечисляемым атрибутом, по-кторому часто может быть поиск, но вариантов этого атрибута - не много, перед вставкой он проверяется, но возможно варианты атрибута поменяются в будущем? Например sex/gender (я быдло и разницы не понимаю, если что): надо делать отдельную сущность gender или enum подойдет? Вообще у меня курсач "агенство по трудоустройству", я хз что делать с типом занятости, типом зарплаты и т.д. - ебнуть их в enum или в другую таблицу? Если в другую таблицу - джоинов много, при этом данных не много, к тому же они явно будут индексированы. Да и enum в реляционной алгебре - явно просто еще одно отношение... Че делать то?
>>1700589 обычно на отдельной единице исполнения. И что? Надо мерять важно это или нет.
Хорошо бы, чтобы http были не серийные, последовательного ожидающие ожидающие ответов,а логически-законченные запросы к какому-то "мидлваре" , application server И тд.
В принципе и с sql та же проблема. Многие программисты ужасно удивлялись, когда их приложение на дельфи перенесенное из локалочки в интернет, начинало тормозить.
Противоположный конец - встраиваемые в программу субд: sqllite, berkleydb, библиотека innodb, embeded mysql (впрочем, его похоронили) . Там действительно все не так как привыкли, нулевые накладные расходы на обмен.
>>1701365 enum подойдёт Чтобы быстро работал поиск, делай индекс по нему. В твоём случае отдельная таблица никакого выигрыша не даёт, да и непонятно, какие атрибуты тебе нужны в таблице полов, кроме названия.
Я оказывается не в старом треде вопрос задал, спрошу еще тут
Есть кто работал с SQLite? У меня в таблицах первичным ключом будет поле с GUID вместо числового с автоинкриментом. Подскажите, как лучше таблицы создать с опцией WITHOUT ROWID или без нее в этой ситуации? Это опция позволяет делать поле, которое является первичным ключом, кластерным индексом. Без этой опции у каждой таблицы создается числовое поле ROWID которое и будет счиаться кластерным индексоа.
Так вот Как у них в документации написано https://www.sqlite.org/withoutrowid.html Что стоит использовать WITHOUT ROWID когда ключевое поле не числовое и когда строки не занимают очень много места. Также эта опция уменьшает ускоряяет поиск и уменьшает место занимаемое строкой за счет того что нету поля ROWID.
PROCEDURE "DELETE_LEAST_PROFITABLE_BALANCE" IS BALANCE_ID_ NUMBER; BEGIN SELECT ID INTO BALANCE_ID_ FROM BALANCE ORDER BY AMOUNT LIMIT 1; DELETE FROM OPERATIIONS WHERE BALANCE_ID = BALANCE_ID_; DELETE FROM BALANCE ORDER BY AMOUNT LIMIT 1; END;
Нужно удалить запись с первичным ключом из Balance и все вторичные ключи этой записи из Operations. Видит ошибку в этой записи, ругается на Statement Ignored и неверное завершение sql предложения.
>>1703199 >>1703216 Да, но мне же еще нужно сохранить ID для удаления записей с ним в другой таблице, это ключ без ON DELETE CASCADE. Ну да, ладно, сработало вот так: PROCEDURE "DELETE_LEAST_PROFITABLE_BALANCE" IS BALANCE_ID_ NUMBER; BEGIN SELECT ID INTO BALANCE_ID_ FROM BALANCE WHERE AMOUNT = (SELECT MIN(AMOUNT) FROM BALANCE); DELETE FROM OPERATIONS WHERE BALANCE_ID = BALANCE_ID_; DELETE FROM BALANCE WHERE ID = BALANCE_ID_; END;
>>1638710 (OP) Блин, где объясняется чтение подобных таблиц для СУБД? Куча стрелочек, причем какие-то с треугольником и кружком на конце, а какие-то с кружком и линией
Есть запрос: Select поле1, поле2... фром... агрегатные функции...where... И есть условие: Where поле1 in (массив_значений) Мне нужно чтобы результат был сгруппировано (group by, ага) по этому условию. Т.е. две строки получалось, с одними и теми же столбцами, но в одной поле1 удовлетворяет условию, в другой нет. Конечно, можно сделать 2 запроса, но ведь как-то можно сделать и одним?
>>1704656 Я не понимаю - что значит сгруппировано по этому условию? Может быть SELECT (CASE WHEN field1 IN [] THEN 1 ELSE 0 END) AS conditon GROUP BY field1?
>>1704606 >Where поле1 in (массив_значений) > в одной поле1 удовлетворяет условию, в другой нет. Выбери что-то одно. Тебе нужна не фильтрация (where), а флаг показывающий состояние по этому условию
>>1698263 Ну рекурсии могут пригодится не только для аналитики (иерархия комментов с пагинацией, например), но к целом дрочить много не надо, надо знать минимум и идти дальше и от задач строить своё обучение
MSSQL Такое дело: есть две таблицы. Одна таблица — сколько вошло, вторая — сколько вышло. Мне нужно как-то придумать, чтобы сопоставить вторую таблицу с первой по принципу FIFO. Например так: table_in ID, AMOUNT 1,3 2,3 table_out ID,AMOUNT 1,2 2,2 3,1 А на выходе должно получиться IN_ID,OUT_ID,AMOUNT 1,1,2 1,2,1 2,2,1 2,3,1
>>1704650 >>1704777 >>1704787 >>1704821 >>1704832 Спасибо за ответы. Коллега помогла с решением. With (массив значений) as table select поле1 in table as условие, поле2... фром... where... group by условие. И получается, то, что я хотел, за один запрос. Не знал, что можно делать CTE из массива значений, и то, что через IN и Group by вот так можно делить, я точно бы никогда не догадался. Надо было больше задачек решать на sqlex, эх. Чувствую себя тупым.
Что прочитать по Postgresql? Много лет его использую, но недавно меня уж очень больно опустили по поводу уровней сериализации транзакций, фантомных чтений wala и прочей хрени. К тому, же, я видимо пропустил много крутых фич, вроде skip locked. Что читать/смотреть по этим двум направлениям?
Блин, как к Postgres на Винде подконнектиться?.. На Линухе я просто заходил через sudo psql и мне было поебать, сейчас на винде (pgAdmin установлен если что, но он не сильно помогает) при попытке приконнектиться через терминал командой psql появляется вот эта залупа: psql: ВАЖНО: пользователь "Антон" не прошёл проверку подлинности (по паролю). Как подконнектиться-то? (нового юзера с помощью CREATE ROLE Антон WITH LOGIN PASSWORD 'password' я уже создал, но толку никакого, psql меня не признает)
Если в id=1 вошло 3, а вышло 2, то почему осталось 2? И да, если ты считаешь число вошедших/вышедших, а не их самих, то какой там порядок (FIFO/LIFO) не имеет значения.
Как правильно хранить списки в MS SQL? Как хранить просто данные о том, что есть множество A и оно состоит из элементов a1, a2 и a3 я понимаю, но как правильно хранить информацию о том, что у меня есть список из элементов a1, a2 и a3, в который пользователь может вставить элемент a4 на вторую позицию и список станет a1, a4, a2, a3, я не понимаю.
Вот допустим есть две таблицы:
CREATE TABLE [dbo].[Item] ( Item_ID INT IDENTITY(1,1) NOT NULL, Name NVARCHAR(50) NOT NULL, CONSTRAINT PK_Item PRIMARY KEY CLUSTERED(Item_ID) );
CREATE TABLE [dbo].[Zone] ( Zone_ID INT IDENTITY(1,1) NOT NULL, Name NVARCHAR(50) NOT NULL, CONSTRAINT PK_Zone PRIMARY KEY CLUSTERED(Zone_ID) );
И мне нужно хранить информацию о расположении элементов в зонах.
Я могу банально сделать вот так:
CREATE TABLE [dbo].[Item_Zone_Position] ( Item_ID INT NOT NULL, Zone_ID INT NOT NULL, Position INT NOT NULL, CONSTRAINT PK_Item_Zone_Position PRIMARY KEY CLUSTERED(Item_ID), CONSTRAINT FK_Item_Zone_Position_Item FOREIGN KEY(Item_ID) REFERENCES [dbo].[Item](Item_ID), CONSTRAINT FK_Item_Zone_Position_Zone FOREIGN KEY(Zone_ID) REFERENCES [dbo].[Zone](Zone_ID) );
Но тогда при вытаскивании первого элемента мне придётся обновлять позицию у оставшихся элементов в зонах и если из этой таблицы будут одновременно много чтений и записей, то меня закидает дедлоками.
Есть такой вариант, его проще обновлять, но для чтения придётся использовать рекурсивное CTE:
CREATE TABLE [dbo].[Item_Zone_Position_V2] ( Item_ID INT NOT NULL, Zone_ID INT NOT NULL, Previous_Item_ID INT NULL, CONSTRAINT PK_Item_Zone_Position_V2 PRIMARY KEY CLUSTERED(Item_ID), CONSTRAINT FK_Item_Zone_Position_V2_Item FOREIGN KEY(Item_ID) REFERENCES [dbo].[Item](Item_ID), CONSTRAINT FK_Item_Zone_Position_V2_Zone FOREIGN KEY(Zone_ID) REFERENCES [dbo].[Zone](Zone_ID), CONSTRAINT FK_Item_Zone_Position_V2_Item2 FOREIGN KEY(Item_ID) REFERENCES [dbo].[Item](Item_ID) );
Есть ещё вариант с тем, чтобы хранить в таблице с позициями ещё и версию расположения элементов в конкретной зоне и вместо UPDATE делать INSERT, но тогда таблицу придётся как-то чистить от предыдущих состояний и как-то избегать ситуаций, когда две транзакции пытаются записать туда данные одновременно (предыдущие два варианта меня подкупают тем, что они должны работать без явно указанных блокировок на стандартном уровне изоляции транзакций).
У меня в голове ещё крутится идея о том, что можно было бы создать таблицу с возможными позициями в зонах (ID позиции, ID Зоны, номер позиции в зоне, ID предыдущей позиции в зоне, ID следующей позиции в зоне) и таблицу-связку для хранения информации о том в какой позиции находится соответствующий элемент. В чём тут профит я не понял, но наверное какой-то должен быть.
Так как лучше будет, чтобы быстро, безопасно и без дедлоков?
Какой правильный синтаксис, если я хочу взять сначала из таблицы все записи меньше параметра_1 а из полученных данных взять только записи больше параметра_2? Я так понимаю надо использовать запрос и ещё внутри подзапрос. Но с синтаксислм что-то не получается
Ну это примерно соответствует моему первому варианту.
А что будет в том случае, когда кто-то будет читать данные из таблицы, по которой идёт этот UPDATE? Часть таблицы заблокирует UPDATE, часть SELECT и скажи привет дедлоку. Если бы я контролировал то, как эти запросы расставляют блокировки, то я бы просто сделал бы так, чтобы они блокировали требуемые им ресурсы в одном и том же порядке, что исключило бы вероятность дедлоков, но у меня нет такой возможности (по крайней мере я не знаю способов так сделать).
Ещё я не понял как обстоят дела с индексами и ключами: судя по коду твоего примера там нет ни ключей, ни индексов на столбце order, т.е. если я буду играться с блокировками, то этот update table set order = order - 1 where order >= ? and order <= ?;
просто заблокирует мне эти строки, но не защитит меня от ситуаций, где другая транзакция вставляет строки, которые тоже подпадают под это условие, что в свою очередь может привести к нарушению целостности данных.
Я имею ввиду ситуацию:
Транзакция 1:
1. Выкидывает из плейлиста песню с номером 5. 2. Песни с номерами больше 5 уменьшают свой номер на 1.
Транзакция 2:
1. Определяет последний номер песни в плейлисте. 2. Вставляет новую песню с номером на 1 больший, чем максимальный.
Если эти операции физически выполнятся вот так, то фигня получится:
В итоге получится, что после первой транзакции список 1, 2,3 ... 100 превратится в 1,2,3,..99, а вторая транзакция превратит его в 1,2,...99,101. Ну и само собой это не единственный вариант такой коллизии, могут быть ещё в варианты с присвоением одного и того же номера двум элементам одновременно.
>>1710021 >Какой правильный синтаксис, если я хочу взять сначала из таблицы все записи меньше параметра_1 а из полученных данных взять только записи больше параметра_2? >Я так понимаю надо использовать запрос и ещё внутри подзапрос. Но с синтаксислм что-то не получается
Почему нельзя объединить эти два условия в одном запросе: WHERE [Table1].[Field1] < @Param1 AND [Table1].[Field1] > @Param2
>>1710085 >Почему тогда в вакансиях пишут "навыки оптимизации SQL-запросов" >>1710066 >ты пишешь ЧТО ты хочешь получить, но не пишешь КАК
Здесь нет противоречия. Даже если тебе требуется переписать запрос таким образом, чтобы он быстрее выполнялся, то ты всё равно пишешь это в декларативном стиле, чтобы оптимизатор запросов построил более выгодный план выполнения, напрямую план выполнения ты не контролируешь (почти).
>>1710815 Что до сих пор нет нормального набора операций из реляционки. Вам бы лишь юбилей двухзначного номера версии отпраздновать поскорее. ГДЕ МОЙ SUBTRACT БЛЯДТЬ?!
>>1638710 (OP) Если я сделал SELECT с припиской ORDER_BY а затем отфильтровал этот упорядоченный дамп записей через SELECT WHERE то получившийся ответ так же будет упорядочен, или надо сновая юзать order by?
>>1712037 Снова надо писать. Поэтому order by бесполезен везде, кроме самого внешнего select, за исключением использования вместе с limit или с чем-то подобным.
>>1712037 >Если я сделал SELECT с припиской ORDER_BY а затем отфильтровал этот упорядоченный дамп записей через SELECT WHERE то получившийся ответ так же будет упорядочен, или надо сновая юзать order by?
Лучше всего представить себе запрос SELECT X FROM T1 WHERE Y ORDER BY Z как T1.Where(Y).Select(X).OrderBy(Z), где Where, Select и OrderBy - это методы (функции) определённые на соответствующих классов. При такой записи станет понятнее, что такое логический порядок выполнения операторов SQL. Так вот, в такой форме ещё легче понять почему если Select и Where возвращают таблицы (неупорядоченный набор данных по определению), а OrderBy возвращает курсор (объект, позволяющий читать данные из таблицы по одной строке в определённом порядке), то после того, как OrderBy вызван, последующий вызов Where снова вернёт нам таблицу, т.е. неупорядоченный набор данных. Строго говоря в зависимости от реализации ты можешь получать и упорядоченный набор данных в некоторых случаях, но рассчитывать на это нельзя.
>>1712043 >Поэтому order by бесполезен везде, кроме самого внешнего select, за исключением использования вместе с limit или с чем-то подобным
И что особенно важно бесполезен в представлениях (VIEW).
>>1710026 >просто заблокирует мне эти строки, но не защитит меня от ситуаций, где другая транзакция вставляет строки, которые тоже подпадают под это условие, что в свою очередь может привести к нарушению целостности данных.
Сильно плохо обновлять поля, даже если значение не поменялось? Использую андроидовскую орм Room которая под капотом использует sqlite. Думаю, стоит ли городить проверки в запросах и в коде ради возможной производительности, или тупо обновлять объект целиком, при этом написав меньше говнокода.
>>1712643 >Он сравнивает побитово? Или как-то магическим образом понимает что это время?
На этапе компиляции определяется тип строкового литерала.
>>1712657 >умаю, стоит ли городить проверки в запросах и в коде ради возможной производительности, или тупо обновлять объект целиком, при этом написав меньше говнокода
Вариант с обновлением всех полей может оказаться даже быстрее, т.к. запрос на обновление меняться не будет и его план выполнения прокешируется.
>Использую андроидовскую орм Room
Сильно зависит от реализации этой штуки, но я бы не задумывался об оптимизации раньше времени.
Сейчас столкнулся с интересной хуйней в МуСкле, объясните пожал-ста: В `хуи` где-то 30к записей (у всех есть ид), в `пезды` 120к (у всех есть ид), в `хуи` есть 20 id, которых нет в `пездах`. Такой джоин (можно просто на иннер заменить, не важно) занимает 4 секунды:
select from хуи left join пезды on пезды.ид=хуи.ид where пезды.ид is null
а такой джоин - 4 минуты:
select from хуи left join пезды on пезды.ид=хуи.ид
Как так получается, что из-за всего 20 ид, которые джоинятся с нуллом, запрос начинает значительно дольше работать?
>>1712931 >>1712899 Хмм, на основе EXPLAIN сделал такое предположение: так как при джоине столбец пезды.ид расширяется несколькими Null, то index на пезды.ид перестает работать, так как рассчитан только на not null. Но это хуйня какая-то, я думал сначала по индексам все достается, выполняется джоин и уже потом идет null-extension для строк справа.
1. MSSQL Always On бывает без листенера? Или подразумевается, что в always on кластере он всегда существует, даже если я не использую балансировку нагрузки (селектов)?
2. Допустим у меня есть готовый кластер MSSQL Always On и есть другая, отдельная бд MSSQL без всяких кластеров, к которой подключено приложение. Мне надо с минимальным простоем это приложение перекинуть на always on. Соответственно, мне надо как-то перенести данные из старой базы в новый кластер. Опять же, если с минимальным простоем приложения, то мне нужно заранее как-то зазеркалить/отреплицировать/что-нибудь старую базу в новый кластер. А потом я просто ткну в приложухе, мол конекться не к старой БД, а к новому кластеру и оно сразу законектится и заебись. Так вот, как мне зазеркалить БД с кластером, чтоб в кластере были те же данные?
1) Таблица "Сотрудники" --------------------------------------------------------------- | id сотр |Табельный номер| ФИО | --------------------------------------------------------------- | 0 | 1 |Иванов И. К. | | 1 | 2 |Иванов И. А. | | 2 | 3 |Иванов И. Б. | --------------------------------------------------------------- 2) Таблица "Услуги" ------------------------------------------------- | id усл |Наименование услуги| -------------------------------------------------- | 0 |Массаж простаты | | 1 |Отбеливание ануса | -------------------------------------------------- 3) Таблица "Услуги сотрудников" ----------------------------------------------------------- | id усл сотр | id сотр | id усл | ----------------------------------------------------------- | 0 | 0 | 0 | | 1 | 0 | 1 | | 2 | 1 | 1 | | 3 | 2 | 0 | -----------------------------------------------------------
Как можно получить такое: ---------------------------------------------------------------------------------- |Наименование услуги| ФИО сотрудников, оказывающих услугу| ---------------------------------------------------------------------------------- | Массаж простаты | Иванов И. К. | | | Иванов И. Б. | ---------------------------------------------------------------------------------- |Отбеливание ануса | Иванов И. К. | | | Иванов И. А. | ---------------------------------------------------------------------------------- ?
Я даже точно не знаю, как сформулировать запрос для гугла. Студент на Access и C#, если что.
>>1714230 Сука ебланская про иннер джойн прочитай одну страничку блядь а не спрашиай на двачах сука даже не одну страничку блядь а достаточно строчек 10 описания и пару примеров, чтобы понять как оно работает еблан сука
>>1714237 Отвечай давай, или сука ебланская, еблан, сука и так далее здесь только ты.
Мне нужно, чтобы строки были как бы объединены, не было повторов, если такое возможно. На примере - по услугам. То есть в первом столбце - наименование услуги, во втором - все сотрудники, к этой услуге относящиеся. То есть ФИО находятся в одной ячейке, и всего строк в получившейся таблице столько, сколько имеется услуг.
Как здесь одним иннер джойном обойтись, раскроешь секрет?
>>1714263 Боюсь, что такое средстами Access не сделать. Если бы была более навороченная СУБД, то можно было бы примерно так: 1. Джоинами делаешь таблицу Наименование услуги | ФИО сотрудника 2. Делаешь string_agg/group_concat/listagg/костыль через конверсию в xml (зависит от СУБД) на ФИО сотрудника. группируя по наименованию услуги.
Возможные грабли: услуги с однаковыми названиями, услуги без сотрудников, решение надо будет чуть подкорректировать.
Приветик. Подскажите, почему при соединении двух таблиц вывод получается с дублями? У них разное число строк, может в этом дело (хотя у одной таблицы 4 строки, у другой - 2, а на выходе их 6.)?
>>1710026 >В итоге получится, что после первой транзакции список 1, 2,3 ... 100 превратится в 1,2,3,..99, а вторая транзакция превратит его в 1,2,...99,101. Ну и само собой это не единственный вариант такой коллизии, могут быть ещё в варианты с присвоением одного и того же номера двум элементам одновременно.
>>1715063 Если уж хочется без явных блокировок, то думаю, что стоит посмотреть, как делается lock-free linked list в памяти и попробовать то же самое реализовать в БД: ведь CAS там есть. Но неужели нельзя просто брать блокировку на весь плейлист?
>>1714769 Я и сказал, что не знаю, как сформулировать запрос гуглу, чтобы выйти на то, что мне нужно. Попросил подсказать, ни к чему не принуждал. И в итоге на меня наехал какой-то дурачок, который даже не разобрался, в чём суть. Всё, что я сделал - ответил ему тем же и поставил на место с его советами не по делу. А тот и замолчал - спесь сбилась, видимо. Ну ничего, будет думать в следующий раз и подбирать выражения, если не нравится, когда действуют его же методами.
Не считаю, что был не прав. И агрессивный здесь точно не я.
>>1715405 Строить логику не на изменении записей, а на выборке. Делать rn по дате обновления например, в таком случае обновленные будут иметь 1, а более старые 2. Т.е. перенести логику на уровень возврата результатов, а не на уровень самой таблицы. Можно делать по двум полям порядковй номер и дата обновления.
>>1715414 >При модификации элементов одного брать блокировку на строку из этой таблицы.
У меня нет возможности блокировать отдельные строки. Сейчас я обхожусь тем, что блокирую (UPDLOCK) все данные в плейлисте (технически в таблице-связке между плейлистами и песнями), откуда идёт перемещение, и в плейлисте, куда идёт перемещение, но это не защищает меня от того, что другая транзакция вставит туда данные. Я пока думаю над тем, чтобы создать некластерный индекс на столбец с id плейлиста и позицией в нём и блокировать данные с UPDLOCK,HOLDLOCK.
>>1718332 >Как грамотно отслеживать изменения в бд? >Интересуют в первую очередь процедуры и вью. Кто, когда и что.
Гугли по слову audit, в зависимости от используемой СУБД должны быть средства подписаться на события создания/удаления/изменения объектов БД (а так же выдачу прав и всё остальное, что тебя может интересовать). После этого регулярно читаешь этот лог и делаешь замечания программистам, которые забывают внести информацию о том, что они поменяли хранимку или вьюшку в связи с таким-то тикетом в комментарий в её заголовке и/или закоммитить скрипты.
>>1720465 >>1720534 Вы вверх крутаните и увидите начало. Там суть в том, чтобы для каждого col1 вывести список из 3 соответствующих ему col2, при этом если для col1 больше 3 col2, то это делается в несколько строк
SELECT col1, string_agg(col2, ' ') FROM ( SELECT id, col1, col2, row_number() over (partition by col1 order by id) as idx FROM t ) q WHERE idx <= 3 GROUP BY col1;
SELECT col1, string_agg(col2, ' ' order by id) FROM ( SELECT id, col1, col2, (row_number() over (partition by col1 order by id) - 1) / 3 as group_no FROM t ) q GROUP BY col1, group_no;
>>1638710 (OP) В Postgres (с которой общаюсь посредствам django orm) в одной из таблиц есть поле is_active, оно BOOL: true или false, приходятся часто выбирать только активные объекты (is_active == true), какой индекс туда лучше заебошить?
Ребят. подскажите пожалйуста, не работает триггер, подскажите в чём ошибка? Может знает кто... DELIMITER $$ CREATE TRIGGER Orders_Trig BEFORE AFTER INSERT OR UPDATE ON orders FOR EACH ROW BEGIN IF:(NEW.SUMMA>10000) THEN UPDATE strakhovka SET Cena_strakhovki = 0 WHERE (ID_Car=:NEW.ID_Car) END IF;
Помогите ньюфажине. Как составить запрос "сколько у какой страницы за последнюю неделю было посещений с уникального айпи"? Если один айпи посетил страницу за эту неделю несколько раз, то засчитывается как одно посещение.
Читаю документацию postgres про многопоточность и что-то не догоняю. Так в каком уровне изоляции можно соблюдать принцип читатель-писатель и не волноваться за некорректные снапшоты?
>>1723945 Что за принцип читатель-писатель? Это как read-write блокировка: Или это producer-multiple consumers, где один процесс создаёт записи, каждую из которых должен обработать только один из потребителей?
>>1726125 Смотря что тебе нужно от AWS. Если нужны просто VPS, то самый дешевый hetzner. Есть почасовая оплата.
>>1726319 Кластер из малинок - это, конечно, круто. Но малинка довольна слабая. И я даже не уверен, что малинка превосходит типичные компьютеры с x86 по отношению производительность/$.
>>1726125 Охуенно сформулированный вопрос, учитывая, что а авс дохуилиард сервисов. Мой внутренний прорицатель осознал, что вопрос задан в треде бд, а потом послал тебя нахуй.
Привет. На связи джун-фулстек с проектом на ms sql server'ах 2014+. В последнее время все чаше нахожу себя пишущим сложные (для меня) запросы с множеством условий, джойнов, групировок, оконных функций, юнионов и т.п. и строгими нуждами по скорости выполнения и потреблению ресурсов. Потому возник вопрос: есть ли какая литература, чтоб SELECT'ты выполнялись молниеносно и потребляли мало памяти, merge и update не дедлочил? А может заговоры порекомендуете?
Гайз есть кто живой? Пишет зеленый, никогда раньше не сталкивался c базами данных, по этому прошу помощи. Кину вам на карту 200р (хахах, я понимаю это мало, но больше не могу дать) за помощь в одном деле, работы максимум на 10 минут.
У кого есть возможность и желание помочь, пишите в телегу: @vovafist
>>1728758 Потому что всем лень писать тебе в телегу. Написал бы задачи тут, можно чуть в видоизменённом виде - поменяв названия таблиц и столбцов, быстро бы получил ответ.
Хочу написать магистерскую диссертацию на тему баз данных. Я вообще фулстак разработчик, что касается баз данных, то частенько приходится иметь дело с ораклом. И вот я решил что поскольку тема баз данных очень обширная, то можно будет какое нибудь направление исследовать и написать выпускную работу Аноны, может вы можете предложить какую нибудь тему? Или может кто уже писал подобные работы
>>1729510 Отвечаю в треде про постгрес не про постгрес, но для себя в базах данных я нашёл https://github.com/mit-pdos/noria. Интересная поделка, которая оптимайзит запросы, храня у себя materialized views для тех запросов, что ей уже встречались. В README репозитория есть ссылка на пейпер, на мой взгляд, про это можно интересно рассказать.
SELECT AccountID,AccountEnabled,AllowAdmin,AllowAlertManagement,AllowTeCustomize,AllowTeReportManagement, AllowTeAlertManagement,AllowPeUnmanage,AllowPeDisableAction,AllowSeDisableAlert,AllowSeDisableAllActions,AllowSeEventClear,AllowXeMapManagement,AllowXeNodeManagement,AllowMonReportManagement,AllowMonUnmanage,AllowViewCopCheck FROM
Можно ли в T-SQL как-нибудь заменить такую простыню из почти одинаковых столбцов на маску? Что-то типа Select 'Allow%' From (пробовал, не работает)
гайз, нужна хелпа. Суть задачи. У меня есть некий запрос, который вовзвращает IDшники из некоторой таблицы. Количество таких айдишников много больше чем CHUNK_SIZE = 10000. Мне надо чанками эти айдишники поочереди записывать во временную таблицу tmp_some_ids (id INT), и вызывать процедуру, которая работает с этой временной таблицей (если кому интересно, эта процедура добавляет в эту тублицу еще одно поле, в котором хранится некоторые значения соответствующие ID). Потом из этой темповой таблицы выгружать полеченные данные, обработать их. И опять залить следующий чанк в tmp_some_ids, и так в цикле пока я не обработаю все записи с первого запроса. ТАк вот у меня есть 3 стула: 1 и самый топорный) выгружить все id в память в ruby скрипте, далее рубями уже поделить все записи на чанки, и запихивать их в цикле во временную таблицу и далее по алгоритму 2) создать/очестить таблицу, к первому запросу добавить LIMIT ${page_number CHUNK_SIZE}, ${(page_number + 1) CHUNK_SIZE} и этот селект инсертить в tmp_some_ids. И в рубях в цикле инкрементить page_number + 1 пока количество заинсерченных данных не меньше CHUNK_SIZE. 3) Похожу на п. 2, только вместо лимитов использовать условие AND WHERE id > ${MY_LAST_INSERTED_ID} и так мне после каждого инсерта надо запоминать MY_LAST_INSERTED_ID = select max(id) from tmp_some_ids для следующей итерации.
Анон, на какой стул сам сядешь, на какой мать посадишь?
>>1731022 Мои же мысли по этим пунктам таковы: 1) тип придется генерить инсерт insert into tmp_some_ids (id) values (${stored_ids[0]}), (${stored_ids[1]}), ... (${stored_ids[CHUNK_SIZE-1]) что как на мой взгляд залупа полная. 2) выглядит норм, но хз как на уровне mysql норм не норм, по сути он передрачивает один и тот же запрос много раз формируюя чанки (возможно я не прав). 3) выглядит тоже норм, но надо делать все время лишний запрос чтобы все врямя получать самый большой айди во временной таблице.
>>1723681 Тогда мы получим уникальные пары столбцов page, ip и их count, что будет соответствовать количеству посещений с каждого ip на каждую страницу. >>1723585 >>1723707 Типо того - это НЕ ТОЖЕ САМОЕ что и group by page, up и это то, что тебе нужно - ты группируешь строчки по имени страницы и дальше для каждой строчки считаешь количество уникальных айпишников в визитах.
Подскажите, пожалуйста, как разумнее соединить таблицу организаций с контактами организации, если в контактах может быть что угодно (куча специалитов, которые абсолютно разные в различных организациях)
Допустим, имеется некая таблица, изображающая производственные цепочки: если сепулька A собирается из сепулей B, C и D, то в поле parent_id у B, C и D будет стоять айдишник в базе хуйни A.
Вопрос: как наиболее эффективно протестить такую таблицу на наличие бесконечно рекурсивных связей, то есть чтобы подкомпонент хуйни C не мог являться компонетом A?
>>1638710 (OP) Как именно работает та же Postgres? В качестве демона? Я когда установил ее у себя в Убунту и работал с ней посредствам Django ORM, никогда напрямую ее не запускал... Это Джанго под капотом "запускает" сервер Postgres или порт 5432 (по умолчанию) доступен с самого начала старта ОС?
>>1737957 Что-то лень вникать, но на первый взгляд различимые в групбае, в эталонном примере, берут ещё 2 поля, т.е. если у тебя по этим полям будут другие значения, у тебя будет больше строк.
У меня есть куча постов (Post) каждый из которых относится к одной из двух категорий, а внутри каждой из этих категорий будет 2 подкатегории По какому принципу лучше всего организовать структуру БД? (Postgres, если что) ManyToMany к подкатегориям, каждая из которых имеет ForeignKey на одну из категорий? Или это нерационально? (постов в распоряжении несколько тысяч, в некоторых случаях поле category может канешн быть null, но это встречается редко)
>>1638710 (OP) Товарищи, возникло желание поискать себе подработку-халтуру.
Что-то такое, что будет занимать пару-тройку часов в будние дни и столько же в выходные. У меня коллеги - админы, так и работают - все время на основной работе + какое-то время на второстепенный проект. Но проблема в том, что я как админ хорошо если чуть выше джуна. Мне приходилось и сейчас приходится иногда выполнять администраторские задачи, с терминалом и unix проблем нет, но человек который занимается этим профессионально сделает эти задачи быстрее и качественнее.
Мое направление больше соотвествует - системной разработке и архитектуре на стыке БД и ОС, оптимизация, немного етль.
И вот вопрос: можно ли по своему направлению найти part-time подработку или фриланс, на каких сайтах-ресурсах лучше искать? Если все-таки искать подработку по админским задачам, то где лучше смотреть варианты, на каких источниках?
Смотрел upwork и freelance.ru но там дичь какая-то одна по типу правки экселек. Может неправильно искал.
>>1742674 На этапе создания таблицы нет смысла проверять констрейнты на наличие, потому что их гарантировано не будет, поэтому по твоей ссылке об этом ни слова нет.
>>1742948 Достаточно навернуть вводную к какому-нибудь MongoDB, чтобы понять для чего нужен NoSQL. Читать эти книги я бы не рекомендовал. Одна слишком большая и нужна разве что только разработчикам СУБД или архитекторам, а вторая - это такое попурри из различных нескучных статеек.
>>1743520 Хостинг с ВМ вообще в ебенях находится, а не на моей машине Просто я ебался какое-то время в консоли, а потом узнал что есть pgadmin. Когда поставил postgres на своей машине на localhost:5432 то спокойно коннектился к серверу через pgadmin. А если ВМ далеко и я к ней через ssh по ключу коннекчюсь? Что в конфигурации на серве надо настроить чтобы меня не дропало при попытках коннекта, фаэрвол тот же?
Котаны, помогите разобраться с функциями времени в PostgreSQL Нужно подсчитать количество записей в таблице с группировкой по неделям. Всё бы хорошо, но если данных за конкретную неделю не было, то в результате запроса не будет номера этой недели значения 0 во 2й колонке. А хотелось бы, чтобы было. Ещё лучше чтобы в 1-й колонке писалось что-то вроде 2020-06-01 - 2020-06-07 вместо номера недели.
select date_part('week', recieved_date) AS week, COUNT(*) AS emails from emails_table where recieved_date >= '2020-06-01' and recieved_date <= '2020-06-30' GROUP BY date_part('week', recieved_date) ORDER BY date_part('week', recieved_date)
Опять postgresql У меня есть несколько запросов из разных таблиц, которые выводят количество или сумму нужных мне данных по месяцам. В каждом запросе есть колонка с месяцами. Мне нужно горизонтально объединить запросы, чтобы вывести все колонки со всех запросов. Только вот в некоторых запросах нет определённых месяцев. Джойнить их не выйдет, так как нет общих полей.
>>1638710 (OP) Меня постоянно попускают на собеседованиях на вопросах по SQL. Есть какой-нибудь годный тренажер и книжка, которая бы популярно объясняла язык SQL и его хитрости?
Создание БД
Аноним08/07/20 Срд 23:33:34№1745485428
Привет парни. Такой супер вопрос, надеюсь поможете. В общем вкатываюсь в БД, начинаю работать с MSSMS и в самом начале охуел с такого момента. Как создавать отношения таблиц как вообще проектировать БД. Кого почитать или посмотреть грамотного что бы доходчиво объяснил про нормализацию БД, отношения, про Primary Key и все остальное. В общем буду благодарен за любую инфу.
В таблице есть поле "категория", категорий всего 4, но записей в таблице несколько тысяч, часто приходится фильтровать данные по конкретной категории, какой индекс выбрать, чтобы это происходило резче? (Postgres 10 если что)
Привет, анон. Помоги с задачей, сам не могу справиться. Привожу минимальное описание. Есть список приборов: CREATE TABLE IF NOT EXISTS devices (id INTEGER PRIMARY KEY); -- Остальные поля не важны Для каждого прибора выдаются разрешения, когда его можно использовать. С одной даты до другой. Для них есть отдельная таблица CREATE TABLE IF NOT EXISTS permits (id INTEGER PRIMARY KEY, use_from DATE NOT NULL, use_to DATE NOT NULL, permission_text TEXT NOT NULL); Кроме этого есть определённая дата @current_date Нужно получить таблицу, в которой будет три поля: id прибора, строка is_permited и permission_text, причём: is_permitted может быть: "NEVER" -- разрешение никогда не выдавалось, "PERMITTED" -- в таблице содержится разрешение, такое, что use_to <= current_date AND current_date <= use_from и "NOT PERMITTED" -- в таблице нет такого разрешения. permisson_text -- пустая строка (или NULL) для NEVER и NOT PERMITTED и permission_text действующего разрешения для PERMITED. Сейчас делаю N запросов для получения разрешений для каждого прибора и проставляю в памяти статус, но это очень медленно, в прод такое нельзя пускать. Буду благодарен как за код, так и просто за идеи. Судя по всему надо делать JOIN двух таблиц, а потом как-то фильтровать результат, но ничего конкретного я сделать не могу. С SQL начал работать один проект назад.
>>1746528 Да, забыл написать. Сделал через один запрос всех разрешений, дальше разруливаю в памяти — получается меньше секунды. Может и не буду городить всё через запрос.
Перекатился недавно с MySQL на PostgreSQL. Кластер не настраивал, все конфиги по умолчанию.
Залил таблицу на 3кк строк, но PostgreSQL почему-то как-то странно выборку делает: каждый раз при одном и том же запросе выдаёт в основом следующие строки через N строк, либо некоторые из них вообще перемешивает.
Грешил сначала на DataGrip, потом на место на диске, но это всё не виновато.
>>1746802 Уточню, что когда в таблице было меньше 200к строк, такой хуйни не было.
Так же только что залил в MySQL, там всё хорошо работает, >select id from records limit 20 offset 500; всегда выдаёт айдишники с 501 по 520, не перескакивая случайным образом на следующие строки.
>>1746802 Ну ёбана, если данные хранятся в КУЧЕ(heap), они ПРОСТО лежат, и бд дастёт их как ей вздумается, да и вобще юд всегда дастёт как ей вздумается, едис ты другого не попросишь. Если нужно доставать быстро и в нужном порядке, ордер бай, индексы, вот это всё.
Аноны, подкиньте идей, куда податься БД-ньюфагу. О себе: Активно изучаю БД / прохожу курсы уже несколько месяцев, в резюме на hh уже есть несколько сертификатов по sql и python. Сейчас прохожу длинный курс "аналитика данных" от яндекс.практикум. 30+ лвл. ДС. Опыт работы - не релевантный, но работа аналитическая в финансах (без программирования). Хочу быть Bi-аналитиком или аналитиком БД, для начала. Стажёром в 30+ лет не вариант идти, да и вряд-ли возьмут. Откликаюсь на все, что плохо лежит (где-то 50 откликов за 2 недели), резюме смотрят, но ни на одно собеседование так и не позвали. Есть идеи куда и как можно вкатиться?
>>1746122 SELECT d.id, CASE WHEN MAX(use_from) <= “11.07.2020” AND MAX(use_to) < “11.07.2020” THEN “permitted” WHEN “11.07.2020” < MAX (use_from) THEN “not permitted” ELSE “never” END AS permitted_text FROM devices AS d LEFT JOIN permits AS p ON p.device_id (или где там у тебя храниться связь) GROUP BY d.id
Если разрешений всегда одно (devices permissions one to one), то убери group by и агрегаты. Также не забудь добавить таблицу отношения devices permissions или ссылку на device к permissions.
with one as ( SELECT p.id ,d.polename1 ,p.use_from ,p.use_to ,p.premession_text ,coalesce(use_from,'1') as Permit ,row_number() over( partition by p.id ,use_from ,use_to order by use_from) as rn
FROM devices as d left join permitsa as p ) SELECT
id ,polename1 ,use_from ,use_to ,premession_text ,CASE WHEN use_from<=GETDATE()>=p.use_to THEN 'PERMITTED' WHEN Permit=1, THEN 'NEVER' ELSE NOT 'PERMITTED' END as permitted_text
>>1748057 Мне показалось, что там нет никакого поля, но нужно самому выдать сконструировать и выдать такой атрибут. Иначе да та прав, нихуя не выйдет и надо будет делать cte
Есть какая-то уникальная колонка. Есть ли разница между запросами? > SELECT unique_column FROM table_name; vs > SELECT DISTINCT unique_column FROM table_name;
>>1749503 Ну основании чего колонка уникальна? Если просто от предметной области, то distinct будет дополнительно эту уникальность проверять. А иначе, возможно, планировщик запросов будет достаточно умным и поймёт что уникальность нет смысла проверять тк она обеспечена другими средствами
Сосач, кароч дали мне тестовое задание по SQL, конкретно по MySQL. Есть таблица департаментов (пикрил 1), есть таблица сотрудников (пикрил 2). Нужно двумя способами получить таблицу со списком сотрудников в каждом департаменте через запятую. Одним способом я сделал через GROUP_CONCAT, получился пикрил 3. А вторым хз как, подскажи. Пытаюсь в CONCAT_WS, но пока только очко раздербанил. С меня солёный хер.
Код первого способа: SELECT d.deptno, GROUP_CONCAT( DISTINCT e.empname ORDER BY e.empname ASC SEPARATOR ', ' ) AS empnames FROM dept d JOIN emp e ON d.deptno = e.deptno GROUP BY d.deptno;
Код моего жидкого пердежа вторым способом (нерабочий): SELECT d.deptno, CONCAT_WS(", ", ( SELECT e.empname FROM emp e JOIN dept d ON e.deptno = d.deptno )) AS empnames FROM dept d JOIN emp e ON d.deptno = e.deptno GROUP BY d.deptno;
>>1749997 Да вопрос был для даунов, но я его не осилил: есть три таблицы. В одной имена, во второй книги, в третьей взятые первыми книги. Нужно было быстро написать запрос таблицу только в общей схеме нарисовали, с чем я и не справился. Хз, м.б. если бы у меня перед глазами были хотя бы таблицы, то я бы смог. Писать нужно было в чате скайпа, а не в sql-е.
>>1742948 >первую прочитай от корки до корки Бесит огромное количество воды и самоповторов. Чувство такое, что Гарсиа этот специально зачем-то объём раздувал до тысячи страниц.
>>1750021 хм, я бы попробовал циклом это решить. Навскидку можно потыкать через row number либо через курсор. Я конечно сам ещё тот погромист, но за твои конкаты я бы тебя обоссал на собеседовании.
у меня горит с sql ex это я тупой или задачи? почему в таблице указывается имя, но в двух строчках указанны классы. Там в "проверочной" версии вопросов все так же?
Добрый вечер, ананасы, хочу как-то хранить статистику всяких событий на фронте в БД (клики, переходы и т.п.). Думаю сделать столбцы event_type и event_date, адекватный ли это способ для хранения статистики, учитывая, что в день может быть порядка миллиона событий?
Аноны, есть одна постгрес БД продовская, хочу для тестирования и дев-сервера иметь ее копию, с возможностью обновления и докачки. То есть, для тестов было бы отлично иметь возможность копаться в БД, удалять/обновлять/писать новые данные, для ДЕВовского сервера тоже самое, но что бы раз в какой-то период времени моя копия получала "обновления" с прода и данные в ней жёстко перезаписывались на новые.
Есть для этого что-то готовое или проще написать самому такую штуку?
>>1751722 Единственный верный вариант решения данной проблемы. Сейчас бы аналитику складывать в медленные постгрес, который ни в кластеризацию ни в шардинг не умеет. Я еще не говорю про медленные запросы и жор ресурсов (в том числе дискового пространства). Если у тебя какой-нибудь заурядный круд для односельчан, то можешь брать реляционную СУБД. А когда тебе нужно хранить аналитику и делать хитрые запросы, которые будет отрабатывать моментально, то тут нужно уже думать и выбирать более совершенные решения. Хотя, если ты считаешь, что сотни миллисекунд на простые запросы это норма, а отсутствие шардинга, распределенных запросов и кластеризации в 2к20 является обыденностью, то ок, можешь дальше пихать своего слона в проекты.
>>1751918 Слон в детстве укусил? Для кликов точно не стоит городить своё, когда уже есть специализированные и проверенные решения с готовой обвязкой. Для большинства проектов pg достаточно.
>>1751918 Абсолютно верно, нахуя тащить реляционку со всеми ее нормальными формами, ролбаками и транзакциями чтобы просто хранить, никогда не менять, читать и агрегировать ссаные логи?
>>1751993 нет никакого потолка и линейного развития.
Может это мой стартап и я деньги на пидорасов-программистов не хочу тратить? У тебя свои ориентиры, а у меня свои. Ты можешь целиться в свой Яндекс, но мне это не надо.
Если я понимаю, что данные за 10 лет уместятся в арендованный сервер 3 Тб сервер, а чтобы агрегация происходила быстро, нужно просто это делать заранее и регулярно, нахера мне Кликхаус?
Чем тебя не устраивает написать скриптец для дампа и закачки? Можешь даже как-то разбить таблицы на части и вручную добавить условия к дампу, чтобы в наиболее объемных таблицах старые данные не дампились.
В свете этого, почему бы не просить админа, пока он сам не автоматизирует?
Аноны у меня наитупейший вопрос. Есть некая большая таблица, мне нужно исключить записи удовлетворяющие сразу двум условиям. Ну например где место = Jopa и цена in (20,30,40).
Анончикс, подскажи пожалуйста, как можно в SQL достать данные из 1 ко многому зависимостей? вот есть таблица пользователи и таблица телефоны. Как мне получить json подобный список {user1:{phone1,phone2},user2:{phone4,phone6}} Это средствами языка собрать сначала список всех пользователей (собрать для них их телефоны и объединить это в нужный) мне или sql сама может так сделать?
>>1753071 Ты хочешь из плоской структуры (таблицы) получить иерархию ккстомного вида. Зачем? Это же вьюха, работа для ORM. Делай джойны и мапь строки в память моделек
>>1753181 Я пытаюсь разобраться и решил перепроверить свои догадки, что в sql это не сделать. Поскольку изучаю сам есть неуверенность в том что полностью понимаю и не пропускаю какой-то функционал, вот и переспросил у коллективного разума Спасибо за ответ :)
>>1753226 Ну смотри - ответ на запрос в реляционную базу это всегда набор строк, содержащий значения столбцов и/или их производных. Эти производные могут быть любыми - кастомные строки, цифры и так далее. Но это все равно будет набор строк. Просто сделай join и дальше направляй результат в модель в ккком хочешь виде - посредством ORM или ручками
Спрошу тут и в С# треде. Вопрос по code-first db migrations в С#. Как вставить ручную SQL миграцию перед последней? Допусть можно пустую сгенерить через Add-Migration и потом вставить свой SQL код в Up и Down. А как ее впихнуть чтобы она перед последней автоматической выполнялась? Можно конечно файл переименовать чтобы таймстап изменить, но как-то криво.
>>1754007 Сам-то как думаешь? нужно знать все те системы, которые ты собрался интегрировать и ETL-ить.
Занятна штука. Расскажи кто тебя заставляет ее изучать? Там есть интеграция питона и какие-нибудь простейшие модели машоба? текстовые преобразования характерные для датасаенса (они называют это NLP)?
Сталкиваюсь с БД впервые. Не понимаю, как всегда, самые азы.
Чем отличается роль от юзера? Как нужно распределять пользователей по базам данных? Как всё это должно быть связано с пользователями в Линукс? Почему не стоит работать с ролью postgres и зачем она тогда вообще нужна? Что НА ПРАКТИКЕ означают разные аттрибуты, наподобие суперюзера, админа и чем они отличаются друг от друга?
В книжках просто постулируется однозначно и объяснение идёт сразу дальше.
Попутно ещё такой вопрос: как внести человека в таблицу, дав ему при этом уникальный id? Как его вычислять?
>>1754788 > Чем отличается роль от юзера? Роль - это что-то вроде профессии внутри одной системы. Разным ролям можно делать только какие-то конкретные действия и нельзя делать ничего другого, просто из соображений безопасности. Ну и роли привязаны к конкретным юзерам (иногда их может быть больше одной). Например, юзер с ролью "двачер" может читать и писать посты, а юзер с ролью "моча" может делать всё то же + редактировать/удалять посты двачеров или банить двачеров.
> Как нужно распределять пользователей по базам данных? Например, таблицы: юзеры, юзеры-роли, роли, роли-действия, действия.
> с пользователями в Линукс Там примерно то же, но действия крутятся вокруг файлов, а роли называются группами. Но это просто аналогичная модель, связи с базами там нет.
> как внести человека в таблицу, дав ему при этом уникальный id? Как его вычислять? Считай, что в базе для каждой таблицы хранится по отдельной переменной-счётчику и написана простенькая функция, которая при каждом добавлении в таблицу записи устанавливает её поле id равным следующему значению счётчика.
Вопрос к великим дба и около того: Можете рассказать стори своих собесов, какие вопросы были вообще, и какие "каверзные"?(хотя каверзность это скорее относительно, но все ж) Алсо, любая инфа по вкату на должность дба приветствуется. ну и про вилки, если можно(мзл)
>>1754747 Ну пока не заставляют, есть несколько стульев на выбор Rest APi, Apach kafka,Apache nifi. Первые два стула очевидно для пограмистов, а судя по описанию nifi, там уже ближе к бд и скулю. NIfi точно будлет юзатся в связки с касандрой, ну и ещё возможно собирать всякие данные со сторонних систем, пока не знаю подробностей, но стул выбрать нужно.
Добрый день уважаемы господа. Беда пришла откуда не ждали. Ток начал гуглить тему Sql и прошу помощи. есть база данных и нужно удалить все строки(из 117 таблиц ) где используется Proj_ID, хелп плиз . С меня лучи добра и + в карму
Мне кажется самый быстрый способ получить списоквсех таблоиц, прогнать через pragma table_info(tablename), найти таблицы в которых есть твоё поле, и уже вручную сделать truncate'ы.
Что-то типо:
SELECT ma.Name, (SELECT name from pragma table_info(ma.name) where name='Proj_ID' )
from sqlite_master as ma
Так ты получишь списко таблиц где есть твоё поле.
Ну или вот так можно, чтоб сразу спсок запросов получить:
SELECT ma.Name as Имя_Таблицы, (SELECT name from pragma table_info(ma.name) where name='Proj_ID' ) as Имя поля ,'Trincate table' +' '+ ma.Name as запрос
from sqlite_master as ma
Но у меня нет под рукой SQLite чтоб попробовать, но общий принцип такой.
Ну и у тебя ка-то мутно написано, тебе все строки из таблицы где есть столбец Proj_ID удалить(то что я описал выше)? Или тебе нужно удалить строки в которых заполнен Proj_ID?
Как быстро вставить 9000 записей в MS SQL Server? Раньше был такой код для SQLite: > execute_command("BEGIN"); > for (int i = 0; i < 9000; ++i) execute_command("INSERT INTO..."); > execute_command("END"); Работало очень быстро. Сейчас пытаюсь тот же код вызвать в майкрософтовском SQL сервере — BEGIN и END отдельными командами он не воспринимает, и работает очень медленно — на то, что раньше требовало 5 минут требует множество часов. Что делать? Использовать синтаксис мультивставки, генерируя многомегабайтовые SQL-запросы?
>>1755868 Тем временем переехал на postgres, стало немного быстрее, но всё равно ппц тормозно. Сходу ничего не гуглится, а что гуглится я сделал (UNLOGGED таблицы). >>1756834 Я серьёзный вопрос задаю — как в шарповом интерфейсе отключить автокоммит, а ты тут остроумием блещешь.
>>1755868 Ну так у тебя наверное коммит идет после каждой записи Генерь не на каждый элемент как insert into, а сделай ее вначале и генерь список values значений которые в инстерте вставояешь, это будет быстрее. На mssql еще гугли bulk insert, на постгресе тоже есть такая тема гугли copy
>>1638710 (OP) Я постепенно на работе вкатываюсь в SQL. Не могу понять, как в результате получить country_id напротив соответствующего столбца с количеством заказов: SELECT COUNT(1) FROM `order` LEFT JOIN `country` ON `country`.`id` = `order`.`country_id` WHERE status_id IN (6,19,31) GROUP BY country_id Подскажите, пожалуйста.
Анон, какую ачивку можно получить самостоятельно для рассмотрения резюме на должности работы с данными? подготовку датасетов или еще какие-то отчеты...
>>1758287 >>1758772 В общем, перенёс сервер СУБД на локальный сервер и теперь всё работает так же быстро, как и с SQLite. Спасибо вам за помощь, няшки. :3
>>1759028 SELECT COUNT(country_id), country_id FROM `order` LEFT JOIN `country` ON `country`.`id` = `order`.`country_id` WHERE status_id IN (6,19,31) GROUP BY country_id
Двач я программист. На работе есть postgres и mssql. Как вообще вкатиться не только в sql, но и в БД в целом. Посоветуй пожалуйста минимум для программиста бэка. Разработчиком БД я становиться не собираюсь, но хочу понимать что там вообще происходит. Может книга обзорная какая где все что нужно есть?
Почему у меня не завершается операция после создания триггера? Почему в Worcbench не подсвечивается слово OLD drop trigger if exists update_user; DELIMITER $$ create trigger update_user after update on profiles for each row begin update users set updated_at = now() where id = OLD.user_id; end $$ DELIMITER ; У меня есть подозрение, что оно вообще не работает.
>>1755110 Никаких, по БД спрашивать особо нечего. - пример запроса с group by - пример с join left и inner - с having - с CTE - что такое индексы и нахуя, cons and props - partitions - connections
>>1765338 в моих телекомах юзают. и то и тоно не я их пишу бля за большие деньги >>1765357 количество коннекций к бд, транзакции с которых она будет\может одновременно обрабатывать мб?
Пс, аноны, для постгресса с очень жирными таблицами (18 лямов+ для таблицы) запрос выборки в 2 секунды - это дофига?
Как вообще понять, какие метрики для потгресса нормальные?
Задачи MS SQL Server по расписанию
Аноним02/08/20 Вск 22:30:06№1766683553
Привет, Аноны.
У меня вопрос по мелкософтовскому серверу относительных баз данных. Есть такой запрос: https://pastebin.com/3DUrsG5S Почему у меня задачи в планировщике имеют статус Runnable - No? И видимо поэтому они хотят исполняться в заданное время. В чём может быть затык?
Что не так с этим sql-tutorial, говорит в начале "вот тебе select from where, тебе задачки на sql-ex" переходишь, ну решил несколько, а следующие уже из этого же списка подсказывают что в них надо использовать явные операции соединения и предикаты, до которых ты естественно ещё не дошёл, т.к. сразу взял и открыл попрактиковаться т.к "ну а почему бы и нет?" раз уж их сразу предлагают в конце главы. Потом вообще в примере использует left join и case с примечанием "смотри одну из дальнейших глав чтобы узнать про case". http://www.sql-tutorial.ru/ru/book_using_null_in_search_conditions.html Мне может вообще наоборот надо читать, с конца этот учебник, вдруг всё встанет на свои места? К самому sql-ex претензий нет но вот такая чехарда это что-то новое для меня.
Как живется разработчикам баз данных? Лучше чем в вебе или хуже? В последнее время все больше интересуюсь базами данных и решил узнать, чем живут разрабы бд. Мимо php мидл
аноны, подскажите пожалуйста , в sql запросе если много объединений таблиц, в объединяемой таблице фильтровать по условию лучше сразу же, в строке с объединением? Или быстрее запрос выполняется если данная фильтрация уже идет в блоке where?
>>1771546 Все это есть на ютубе абсолютно бесплатно, так же можно скачать книги, по ним тоже отлично учиться материал, есть сайты с практическими задачами и они тоже бесплатные, если тебе некуда деть деньги, дай их мне
>>1770974 Оптимизатор поймёт и сведёт к единому фильтрацию в ON и WHERE но только в случае если они эквивалентны, что конечно же происходит не всегда, например left join, да
>>1638710 (OP) Анон, я тупой и мне нужна твоя сила. ЛЮБАЯ ПОДСКАЗКА. Есть таблица, где пишутся логи юзеров действие-роль-имя-datetime нужно в виде вьюхи представить эту таблицу по типу 9.00 18 августа - Иванов 9.00 18 августа - Петров 9.05 18 августа - Иванов 9.05 18 августа - Петров 9.05 18 августа - Сидоров Где с шагом 5 минут будут имена тех, кто в это время был active(не совершил logout)
>>1777703 Попробовать юзануть оконные функции. Или написать процедуру, которая будет бежать циклом по оригинальной таблице и подсчитывать то, что тебе нужно, а вьюха будет вызывать эту процедуру.
>>1778246 А хули ты тогда ебёш вола? Просто делаешь джоин по этому полю, и у тебя оджна строчка - это ссесия, с временем начала и временем конца. Если нужно по отрезкам порезать джоинишь к календарю, с нужными отрезками времени
>>1778261 Да говорю же, тупой! Сказывается конец рабочей недели. Вот так как-то вышло, анон. https://pastebin.com/nB19m7Es Сейчас календарь еще таблицей накидаю, чтобы к нему джоинить, а то вьюха не переваривает чот переменные. И спасибо за помощь.
че за программы в которых пишется код? оракл микурософт что то там какая лучше? и чем они отличаются от допустим написания того же кода в VScode? Чем сложно перекатить? И скопировать ОПпост отсюда Так?
Антоши, есть кун 32 лвл, есть вышка по информационной безопасности, есть приличный стаж админства и понимание что меня это все заебало и я разочаровался в этой сфере, так вот, есть мысли вкатиться в разработчика БД. Есть скудные знания о БД и SQL после универа. Есть ли смысл идти в эту сферу? Есть ли варианты пойти куда то джуном с возможностью там же и подтянуть знания? Есть ли среди вас те кто перекатился в разработку БД из других сфер IT?
Разработка веб-приложения для хранения и защиты БД
Аноним21/10/20 Срд 19:32:46№1836366589
Гайз! Нид хелп, плз! Как юный пекус, не имеющий опыта в написании курсовых. Советов мне! В чём может быть научная новизна в приложении - аналога oracle? Функционал веб-приложения реализуется через браузер, полностью поддерживает расширения CSS и полный набор HTML-тегов, а также отсутствует привязка к стандартной библиотеке. Обеспечена концепция детализации и перекрестная фильтрация. Встроен аппарат статистики и анализа данных, возможность построения 3D моделей. Обеспечена высокоуровневая защита данных через соответствие паттерну.
Помогите плз задачку решить с sql-ex. Select(обучающий этап). Задача 125. Решаю на MS SQL Server
ЗАДАЧА Данные о продаваемых моделях и ценах (из таблиц Laptop, PC и Printer) объединить в одну таблицу LPP и создать в ней порядковую нумерацию (id) без пропусков и дубликатов. Считать, что модели внутри каждой из трёх таблиц упорядочены по возрастанию поля code. Единую нумерацию записей LPP сделать по следующему правилу: сначала идут первые модели из таблиц (Laptop, PC и Printer), потом последние модели, далее - вторые модели из таблиц, предпоследние и т.д. При исчерпании моделей определенного типа, нумеровать только оставшиеся модели других типов. Вывести: id, type, model и price. Тип модели type является строкой 'Laptop', 'PC' или 'Printer'.
МОЙ ЗАПРОС
with LPP as (select 'PC' as type, code, model, price from PC UNION ALL select 'Laptop', code, model, price from Laptop UNION ALL select 'Printer', code, model, price from Printer), AA as (select row_number() over(order by code desc, type) down_sort, row_number() over(order by code, type) up_sort, code, type, model, price from LPP)
select down_sort, up_sort, type, model, price from AA
Я короче сделал сортировку первый-второй-третий (up_sort) и последний-предпоследний (down_sort) Но вот как сделать их чередование я хз. Так что либо помогите допилить мое решение, либо тупо скиньте свое, в любом случае поклон вам в ноги