Вы видите копию треда, сохраненную 24 января 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
в котором мы
-Выслушиваем, почему в шапке по-прежнему отсутствует инфа для вкативания
-Разбираемся, почему PostgreSQL - не Oracle
-Пытаемся понять, зачем нужен Тырпрайс, если есть бесплатный опенсурс
-Обсуждаем, какие новые тенденции хранения данных появляются в современном цифровом обещстве
-Решаем всем тредом лабы для заплутавших студентов и задачки с sql-ex для тех, у кого завтра ПЕРВОЕ собеседование
-Анализируем, как работает поиск вконтакте
-Игнорируем конкаренси-шизика, не понимающего, зачем базы данных нужны
-И просто хорошо проводим время, обсирая чужой код, не раскрывая, как писать правильно
Поехали!
Может кто-нибудь рассказать свою историю успеха и кто как вообще учился этому ремеслу?
(3 курс-кун)
Алан Бьюли - Изучаем SQL
Не слушай его, это чмо без ВО. Тебе еще магу надо окончить прежде чем идти куда-то
Стоит ли пытаться городить linked list в Postgres или такую хуйню лучше в NoSQL мутить?
Да.
А кафедру?
Братаны, нужен адекватный механизм для удаления устаревших данных из БД. Можно конечно ставить что-то типа DateField и на сервере каждые n минут проверять разницу между текущей датой и выставленной, если она превысила порог в скажем 30 дней, мы удаляем запись. Но что если сервер ляжет и его время сбросится в ебеня?
Как вообще реализуют удаление устаревших данных в БД (вне зависимости, реляционная это база или noSQL)?
Нельзя раз в день запускать?
> сервер ляжет и его время сбросится в ебеня
Тогда отсчитывать разницу не от текущей, а от последней добавленной, например, но это при условии, что новых записей с неправильным временем не появляется. А если появляются, то ничего не поделать и придётся при каждом инсерте проверять триггером, что нету более новых записей.
Если ты о sql курсиках - каким-то джуном дата аналитиком можно.
И то, нужны еще доп. знания. Если прорываться куда-то в банк, телеком то нужно еще немного подчитать о екселе, т.к. без него увы никуда.И хотя бы одном аналитическом пакете (чаще всего Power BI)- важно знать что такие есть и зачем они, остальное - наживное. Типа когда тебя на собесе спросят знаком ли ты с какой-то приблудой, ты не обосрешься, а скажешь типа:
- "Немного опыта, знаю что используется для построения отчётности о количестве собраного говна в секунду"
И обычно этого достаточно для мимоджуна во всякие полулегальные банки.
Если прорываться в айти - то хоть немного подчитать о джире, гугл таблицах. А главное быть в чуть курсе стрима из которого продукт конторы куда ты собеседуешься.
мимо-вкатившийся
Сделай двойную проверку, вторым запросом проверяй промежуток между удаляемой и текущей, если больше 2 месяцев скажем, не удаляем ничего
> Но что если сервер ляжет и его время сбросится в ебеня?
Атомный источник, ntp сервер, прописанная в поттердэ синхронизация в момент запуска, всё это в противоядерном бункере в противошоковой камере на подвесах.
помогите плес написать (это изи, я знаю, прост нюфаг)
⦁сосчитать количество сольных артистов, чь альбомы продались тиражом более 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.
заранее спасибо, анончики
Вы заебали студенты ебанные, хоть бы блять начал решать для приличия, и спросил что непончтно. Иди нахуй, чтоб тебя отчислили ленивый уебок. Мы не твоя личная армия.
сап, ночной
обращаюсь ко всем бывалым анонам. какую nosql субд выбрать, при условии, что чаще всего при работе с бд будут выполняться много операций чтения и записи МАЛЕНЬКИХ данных (размером ~10-30 байт)? пока что в гугле нихуя не нашел, но может вопрос будет для кого-то супер очевидным. добра.
А как гуглил? Я вот погуглил NoSQL Highload, и вроде возвращает варианты. Даже бенчмарки какие-то
Вообще, какие юзкейсы?
Уже ничем, попав в интырпрайз из монги усиленно переделывают обычную реляционную СУБД - уже добавили транзакции, следом и статичная схема появится, а там уже и до нормальных форм недалеко.
Вот например у меня Duble, нужно сделать джоин к varchar, так мне приходится 2 раза кастить(сначало в инт, чтоб убрать нули, потом уже в текст). Но наверное есть способы получше?
Очень часто. Чем нормализованней - тем чаще.
В прикрепе задание и таблицы текущей схемы.
https://pastebin.com/tkGYpBgF - здесь решение, которое хуй знает как валится.
Хуже всего что на этом дремучем sql-ex при прхождении запроса на второй и третьей базе не показывают результирующие данные, в то время как на всех нормальных сервисах типо leetcode'a и прочих, всегда есть какой-то референс.
Чем дальше в лес, тем глубже трясина.
https://pastebin.com/1Eh494wV
В этот раз заговнокодил на славу, с кучей соединений строк и их реверсом, на второй базе выдает меньше на 16 чем нужно, до коле?
Есть какой-то сборник задач по SQL? Желательно онлайн. Ещё лучше с ответами.
Хочу руку набить на запросах.
Например, есть две таблицы, такие-то поля, такие-то данные сделай такую выборку, сделай такую же, но отсортируй данные по дате. Сейчас я спокойно пишу запросы там где нужно, но с гуглом. Надо практики побольше, а сам я ничего особенного из головы придумать не могу.
>на этом дремучем sql-ex при прхождении запроса на второй и третьей базе не показывают результирующие данные
В факе даже написано почему - чтобы люди разбирались с сутью задачи, а не подгоняли ответы.
Джон - просто объединение. Объединяешь с помощью ключа - того, что есть в любом коде. Объединение может быть тоже разное
Правое, левое, классическое.
Да, я уже тред почитал, нашёл. Всё равно, спасибо!
нет
Вечер в хату! Че насчет scylladb скажите?
Двач, сегодня нужно было срочно по-быстрому преобразовать емейлы уровня
Мейлы из списка только двух видов:
Потом фамилию в этом виде при определённых условиях нужно было добавлять к ещё одной строке, но суть в том, что само преобразование получилось очень громоздким.
Я вспоминал и искал все подряд строковые функции и лепил, лишь бы быстрее доделать, и оно таки заработало.
А потом представил ситуацию, что если домен будет нетипичным, или у человека будет двойная фамилия, в общем, всё опять нагромоздится, или пойдёт по пизде.
Приложил этот кусок запроса с прикрученными тестовыми данными. Анон, можешь пояснить за то, как корректно юзать строковые функции, и показать, как это нужно было делать на самом деле?
declare @t as table (
row int
,fio varchar(255)
)
insert into @t
values
(1,'
,(2,'
,(3,'
,(4,'
--SELECT * FROM @t
SELECT
fio as [login]
,STUFF(
IIF(
LEN(REPLACE([fio],'@domain.com','')) - LEN(REPLACE(REPLACE([fio],'@domain.com',''),'.', ''))=1 --если в логине одна точка, например
,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','')) -- удаляем всё после второй точки, это на случай, если в логине две точки, например
, 1, 1, UPPER(LEFT(IIF(LEN(REPLACE([fio],'@domain.com','')) - LEN(replace(REPLACE([fio],'@domain.com',''),'.', ''))=1 --если в логине одна точка, например
,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','')) -- удаляем всё после второй точки, это на случай, если в логине две точки, например
,1))) as [last name]
FROM @t
Двач, сегодня нужно было срочно по-быстрому преобразовать емейлы уровня
Мейлы из списка только двух видов:
Потом фамилию в этом виде при определённых условиях нужно было добавлять к ещё одной строке, но суть в том, что само преобразование получилось очень громоздким.
Я вспоминал и искал все подряд строковые функции и лепил, лишь бы быстрее доделать, и оно таки заработало.
А потом представил ситуацию, что если домен будет нетипичным, или у человека будет двойная фамилия, в общем, всё опять нагромоздится, или пойдёт по пизде.
Приложил этот кусок запроса с прикрученными тестовыми данными. Анон, можешь пояснить за то, как корректно юзать строковые функции, и показать, как это нужно было делать на самом деле?
declare @t as table (
row int
,fio varchar(255)
)
insert into @t
values
(1,'
,(2,'
,(3,'
,(4,'
--SELECT * FROM @t
SELECT
fio as [login]
,STUFF(
IIF(
LEN(REPLACE([fio],'@domain.com','')) - LEN(REPLACE(REPLACE([fio],'@domain.com',''),'.', ''))=1 --если в логине одна точка, например
,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','')) -- удаляем всё после второй точки, это на случай, если в логине две точки, например
, 1, 1, UPPER(LEFT(IIF(LEN(REPLACE([fio],'@domain.com','')) - LEN(replace(REPLACE([fio],'@domain.com',''),'.', ''))=1 --если в логине одна точка, например
,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','')) -- удаляем всё после второй точки, это на случай, если в логине две точки, например
,1))) as [last name]
FROM @t
Попытка отвязаться от почтового домена и двойной фамилии нагромождает запрос ещё сильнее, а заменить регистр второй части двойной фамилии мне уже не удаётся.
declare @t as table (
row int
,fio varchar(255)
)
insert into @t
values
(1,'
,(2,'
,(3,'
,(4,'
--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)))
,1)-1) as [last name]
FROM @t
Попытка отвязаться от почтового домена и двойной фамилии нагромождает запрос ещё сильнее, а заменить регистр второй части двойной фамилии мне уже не удаётся.
declare @t as table (
row int
,fio varchar(255)
)
insert into @t
values
(1,'
,(2,'
,(3,'
,(4,'
--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)))
,1)-1) as [last name]
FROM @t
вопрос следующего характера: существует Data Grip (предположу что это СУБД от jetbrains)
Друг накатал там пару таблиц в полноценную базу, скинул архив на облако, я скачал
а теперь выяснил, что не могу "открыть" папку как проект точнее могу но потом на стадии визуацизации таблиц вижу говно
В теории разбираюсь очень неочень, если пишу не туда пошлите куда надо пж
Чото ты хуйни нагородил, я б за такое пидел ногами но я сам тоже из этих. Простой сделай split.
*пиздил
Чтоб её открыть нужно чтоб был сделан нормальный экспорт или на худой конец бекап, просто так что-то открывать заебешься.
Попал на проект, где эта шняга используется во всю, а я нихрена в ней не понимаю
Есть какой-то материал для быстро входа в Оракл? Я понимаю что основные концепты остаются те же, но есть ведь нюансы. Особенно интересует вопрос взаимодействие с БД, администрирование, какие тулы есть, каким клиентом лучше пользоваться и структура СУБД как таковой.
Тут никто не хочет отвечать на вопросы по вкату, только одни сеньоры ДБА сидят и иногда помогают друг другу с ебически сложными задачами.
У меня оракл на соседнем проекте, иногда приходится с ним взаимодействовать. У меня срака перманентно горит из-за отсутствия стандартных функцией скуля(банально TOP). Взаимодействие через Oracle SQL Developer( ну тебе там местные ораклиытсы должны пояснить за это говно).
в общем скажу так. я смог открыть ее и могу например визуализировать таблицы, но при попытке выполнить любой тест запрос (селект какой-нибудь например) получая ошибку в ебало
Не слушай того неосилятора, у оракла есть все, что есть в ANSI.
PL/SQL developer тебе будет лучше, как новичку, но нужно будет настраивать клиент, в инете инфы полно.
Насколько быстрый и глубокий вкат ты хочешь? Можешь гуглить transact top oracle, а можешь посмотреть часов 45 лекций Игоря Мирончика, выбор за тобой.
А как ID у постов и тредов на разных досках автоинкрементируются обособленно друг от друга?
Скорее всего, настоящий ID мы не видим, и он, да, уникальный. Но кроме него есть ID борды и номер сообщения, уникальный в разрезе одной борды и инкрементящийся каким-нибудь триггером, типа
post_nomer := select max(post_nomer) + 1 from posty where borda_id = :borda_id;
Это получается на каждый новый пост вся таблица с постами просматривается и ищется самый большой номер поста, не жирная операция на практике?
Где сказано о практическом применении нормализации?
Любое хранилище с несколькими тысячами справочников и сиквенсами на каждый сейчас в голос проорали.
Ты серьезно? Ты думаешь, что на каждую из, пускай, сотни, досок сделать сиквенс - это затратно?
Какой я молодец.
Введение в системы баз данных К. Дж. Дейт
Как прокачать знания в базах данных? Все эти уровни изоляции транзакций, написание сложных SQL запросов, тюнинг SQL запросов, индексы и как их правильно создавать, администрирование и тюнинг СУБД.
Ты не поверишь - решать задачки.
Делаешь стенд и хуяришь, потом устраиваешься на работу и там хуяришь.
Хватит какого-нибудь постгреса запущенного в докере и документации к нему?
Ну задачки таки лучше нарыть отдельно.
Вполне себе достаточно должно быть
Почти для всех вопросов "что почитать по базам данных, индексам и т.д." есть один универсальный ответ - книга Томас Кайт "Oracle для профессионалов".
Качаешь, читаешь те главы, которые тебе нужны/кажутся интересными. При необходимости возвращаешься и перечитываешь/смотришь видосы на тытрубе.
Сразу ответ на вопрос "но книга же по ораклу, а у меня postgresql/mysql/mssqlserver" - у всех самых популярных бд почти идентичный набор функционала. Знание того же оракла дает понимание, что можно сделать в любой другой субд, детали нагуглить не проблема.
Кстати, oracle для docker тоже есть.
Адекватные и релевантные знания по администрированию/тюнингу/уровням изоляции и возникающим с ними проблемам приобретаются только опытным путём в работе. Но теория всегда не помешает.
То есть что нельзя пропустить нормальную здоровую строчку без NULL'ов, используя INNER JOIN?
Ну типо да, ты такой джоинишь, джоинишь, а там хуяк NULL
tabl1.pole=1 >>>>>>>>>>> tabl2.pole=1
tabl1.pole=2 >>>>>>>>>>> tabl2.pole=2
.......
tabl1.pole=1 >>>>>>>>>>> tabl2.pole=нет такого....
И тут скуль такой: Эсукабля, чо это такое, пошёл нахуй!
И выкидывает строчку. А если ты ему слева\справа хук ебашишь, то он не выкидывает, говорит , Я ВСЁ ПОНЯЛ и добавляет её в результирующий набор.
Хотя есть одно но, если я уберу галки "каскадное обновление связанных полей", и "каскадное удаление связанных полей", оставив только "обеспечение целостности данных", то получается создать связь, но мне те галки нужны. Что делать?
> Тип данных проверь
Проверил. Везде как на пикрил. Тип "счетчик", длинное целое, последовательное.
> не лезь дебил, зачем тебе этот ассес?
По учебе надо именно в нем делать
Не влезли нижние параметры на скрине
PSQL, если что.
То есть из 4 строк данных, надо сгенерировать одну(и немного переработать), с полным содержанием инфы по юзеру.
Не думаю что с этим говном кто-то будет разбиратьса тут. Приходите с вопросом по sql здорового человека.
Ну меня больше интересует подход + немного кода(или хоть куда копать).
Неужели такая агрегация - что-то странное и необычное?
Да это параша гавно мамонта, там не кода, не инструментов, нихуя нет, какой-то костыль уровня 1с. Попробуй не через меню, а запросом сделать, оно должно понимать sql.
Тебе надо развернуть данные?
То есть, например, у него channel есть и Instagram, и Twitter - надо сделать в результате запроса два столбца?
Типа
Id1 Instagram
Id1 Twitter
->
Id1 Instagram Twitter
Pivot или max(case) может тебе помочь.
>>655039
Вот как то так, но это 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'
Там анон выше писал что ты пивот хотел..Или не пивот а строчку собрать..Или просто данные в таком формате? Объяснитесь, сударь!
Я решал, причем хорошо, но забыл синтаксис. Серьезно.
Надо пользоваться на практике. Что не используется - вытесняется из памяти.
Я хотел из 4 строк получить одну строку.
Учитывая что юзеров много и у каждого такой набор параметров о них как на скрине, эти их кучи строк хочу в одну склеить, заменив эти их "триалы/конверты" и прочее на отдельные столбцы с 0(не было такого действия) / 1(было действие).
Как-то так.
>>655341
Скорее свернуть надо, сделав и N строк о юзере одну строку с кучей столбцов.
Спасибо, почитаю про эти штуки.
>>655342
Немного не подходит.
Вот такой код сейчас сделал - https://pastebin.com/nvXKEQzg
В результате пик 1 из пика 2 получается.
Хотя пытаюсть получить строку вида:
"NL04XU2GiATNXRaQSZ3...." | "iPhone 8 Plus" | "CA" | 1 | 1 | 1 | 2 | "female"
Из N строку одну с кучей столбцов.
Ну все правильно, тебе надо развернуть таблицу.
select id,
max(decode(param, 'param1', value)) as param1, ...,
max(decode(param, 'paramN', value)) as paramN
from table
group by id
У тебя на каждую строку останется только одно заполненное значение в столбце, а max их схлопнет.
Проблема в том, что много хардкодить надо.
Или заводить справочник, по которому динамически будет строиться запрос.
> Проблема в том, что много хардкодить надо
Это да, но набор столбцов не окончательный, сейчас пытаюсь найти какие-то зависимости и выбрать нужные мне данные.
Спасибо, антош, буду пробовать.
Стек - sql server,teradata
Ну и SSIS,Pentaho и прочая залупа
Игогда переписываю или пишу процедуры и прочую хуету
Куда двигаться дальше - хз
Как выбраться из говна, пойти в HADOOP и начать учить Джаву...
Вопросики:
Написать модуль на t-sql, который позволить сотворять элементарные действия с таблицами
Проверки, тригеры и тд
Набор хранимок/функция/тригеров
Есть таблица вида
Имя | Поле1 | Поле2 | Поле3 | ID
В таблице есть одинаковые строки с разными ИД. Скажем есть ИД 2 и ИД 3, в рамках этих ИД есть одинаковые строки отличающиеся только ИД, так же есть много других строк\ид, которые не повторяются, пересечения только в рамках строк у которых ИД 2 и 3.
Соотвественно мне нужны строки с ИД 2, которых нет в ИД 3. Вроде как просто решается подзапросом, но какой-то топорный метод, нельзя ли что-нибудь поизящней с OUTER JOIN прикрутить?
Вот пока так:
SELECT *
FROM dbo.govno
WHERE ID=1
and Имя not in
(SELECT Имя
FROM [хд_в].[Пункт]
WHERE ID=2)
ORDER BY Имя, ID
Опять же пока все наименования уникальны в пределах ИД, но нет гарантии что так же и сотанеться.
На
Select t1.*
From tab t1
left join tab t2
On t1.имя+поле+поле2+поле3= t2.имя+поле+поле2+поле3
Where t2.id is null
Ну это тоже говно какое-то. Есть же наверное более изящный способ через intersect какой-нибудь. Смотрим пересечение ИД 2 и 3, а потом выбрасываем их.
В таблице есть уникальное поле с ключем, т.е идентифицировать уникальную запись можно, нужно только найти общие элементы.
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
select id2, name, f1, f2, f3 from (
select name, f1, f2, f3 from t where id = id2
minus
select name, f1, f2, f3 from t where id = id3
);
То есть это редкость, недели правило, забыть, что такое except, union и т д при обучении?
Нежели
Вообще ты не учел главного.
Sql планировался как язык для домохозяек менеджеров, потому почти все его конструкции очень логично звучат и так же логично переводятся на родной тебе язык. Это касается как и принципа работы, так и принципа вызова/написания этих конструкций.
Ты же не используешь каждый день все слова из своего лексикона, но когда встречаешь - понимаешь, что знаешь это слово.
хехехех
А что не так?
Ну серьезно.
With - с. Такой таблицы нет, теперь будто бы с ней в схеме.
Over - над. Если бы ты смотрел аналитические функции плотнее, то вместе с partition(сиречь, группировкой, частью) и range/rows beetween все очень просто и интуитивно понятно - операция над диапазоном.
Partition - та же часть - в контексте деления таблиц тоже очень простая формулировка.
Юзкейс - интерфейс дающий возможность посмотреть amount за произвольный период с произвольной разбивкой. Основные варики: каждый месяц в году, каждую неделю в году, каждый день в месяце, каждый день в неделе, каждый день в две недели, каждые 12 часов в неделе, каждый час в день, каждые два часа в день и т.д.
У меня есть некий рест, который должен отдавать только изменения в базе данных по запросу пользователя. Что то вроде long pooling или вебхуков.
Мне кажется что я делаю велосипеды, когда навешиваю на бд триггеры или каждую минуту отправляю селекты.
Для этого существует ORM или это как-то по-другому проще можно сделать? Типа контроля версий бд?
Эм, ну пользователь спрашивает отдаешь ему все данные старше 5 часов например, и обновляешь переменную, чтоб в следующем запросе показало только то что обновилось с прошлого.
Я хз, но звучит как дохуя кода. Сначало тянем общие данные за период, а потом в зависимости от потребности режем их. Соответсвенно на каждую фракцию своя обработка, процедура на вход принимает период и фракцию, отдает результат.
А как эти данные меняются? Что мешает тебе при изменении данных, на уровне DAL создавать копию тех, что ты отдаешь пользователю и при запросе использовать её?
Что пришло в голову,
Пользователь указывает год, месяц или неделю
или то и то
в sql servere есть функции, которые возвращают:
месяц
номер недели
Как это будет выглядить?
В почем понимании пользователь хочет посмотреть данные за 2020 и 33 неделю
where year(datetime)=2020 and wk(datetime)=33
Вот тебе и нужный результат
Но у тебя будет несколько кейсов поведений пользователя, тебе придется писать запрос на каждый кейс
Хуйню я пишу невнятную с утра пораньше
каждый месяц в году,
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(твоядата)
Продолжать не буду
Давненько сикуль не трогал, но что мешает написать что-то наподобии
SELECT
bucket(inserted),
SUM(amount)
FROM mytable
GROUP BY bucket(inserted);
где bucket - функция конвертирующая дату в некоторое значение для последующей группировки (для годов - получение года из даты)?
В запрос передаешь дату последнего запроса и отдаешь всё что после неё. Вопрос лишь в том, кто хранит эту дату - сервер или сам клиент?
>>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, а чтобы непрерывный мониторинг был и не нагружать бд кучей запросов. И не писать велосипедов самому.
Звучит так будуто тебе нужно читать лог. Тоже самое что писали выше, но параллельным запросом к жрналу с таблице с логом. Хз может из журнала транзакций это тянуть, не щнаю какая там структура .
Это прямо то, для чего создавалась Kafka. Просто пишешь в неё нужные действия при изменении БД, а клиентами вычитываешь их.
Есть готовые коннекторы к БД (для postgres, например), которые как раз занимаются тем, что пишут из коммит лога в кафку.
Нужна условная streaming аналитика.
База данных должна держать определенное окно данных (FIFO).
И иметь продвинутое апи, позволяющее хитрые выборки с встроенными статическими функциями.
Кроме spark.
У оракла для мониторинга изменений прямо в базе есть FGA.
Если производительность не критична, и объектов мониторинга немного, то триггеры вполне рабочий вариант, до появления логической репликации часто так и осуществляли мониторинг изменений.
Иначе следует смотреть в сторону репликации-чтения логов транзакций, если требуются именно измененные данные, как написали выше. Если достаточно запроса направленного в базу, то можно попробовать подцепиться к логам базы.
Но последние два варианта скорее всего не будут простыми, так как репликация в большей степени нацелена на запись в стэндбай. Полученные данные от потока репликации вероятно придется самому парсить, и отслеживать прогресс чтения логов, так как не все базы отдают информацию транзакционного лога в user-friendly формате
Надо генерировать статистику на каждую дату - сколько для каждого сайта было записей каждого типа + разницу с прошлой датой. Сколько каждого типа добавилось, сколько уменьшилось.
Вот это последнее надо как-то эффективно реализовать.
Я наколхозил такое и оно работает, но медленно, и с ростом количества записей всё медленнее. Каждый раз добавляется в районе 50к записей.
https://pastebin.com/2wHX7ATd
в СУБД только два способа решения проблем:
1. навешивание дополнительных индексов
2. предвычисления
используй п.2. не используй group by,но вычисляй эти самые факты и храни в отдельной таблице.
чтобы вычислить результат группирующей функции, нужно вычислять результат группирующей функции!
блядь. куда еще быстрее?
разумеется, ты можешь попытаться оптимизировать группировку индексами, но суть от этого не меняется.
поэтому, если данных действительно будет много, лучше сразу заняться предвычислениями при обновлениях.
Индекс на (site, scrape_date) есть?
>t2.id IS NULL
Это ещё откуда взялось и зачем нужно? Пишешь нам одно, а делаешь другое - так проблему сложно будет решить.
Индексы есть, да.
> Это ещё откуда взялось и зачем нужно? Пишешь нам одно, а делаешь другое - так проблему сложно будет решить.
То же самое. Идея такая - два подзапроса за разные даты джойнятся между собой по урлу и выбираются только те, где нет соответствия.
Т.е. если такой запрос сделать на date1,date2, то будут только исчезнувшие, а если date2 date1, то только новые.
Что за база? План запроса есть? Железо какое?
Не пробовал аггрегацию по всей таблице в разбивке по дням делать?
Попробуй партиционирование по дате добавить !вместо индекса.
В 95% запросов, говорю тебе со стороны дата анализа, тебя даже на собес не пригласят если джоинов и юнионов не знаешь.
Задавай вопросы что интересно. Я тоже с гуманитарным высшим, таких перекатившихся куча, ни разу за 6 лет никто даже не пошутил об образовании и должности.
Интересуются ли прошлым опытом?
Есть ли возможность карьеры при усердии и трудолюбии?
Коллектив какой? Не бывает ли конфликтов? Дружелюбные ли?
Как проходит собеседование? Тяжело ли было?
>Интересуются ли прошлым опытом?
А о чём спрашивать если ты перекатываешься, лол. Разве что, если будут какие-то интересные моменты в твоём прошлом опыте(матан, языки) - то спросят. Запомни, когда джуна спрашивают о чём-то на собесе то это 100% чтобы прощупать теор.базу, а не чтобы завалить. Сам собеседовал 2х джунов.
>Есть ли возможность карьеры при усердии и трудолюбии?
Карьера в классическом понимании в IT отсутствует, здесь всё просто, если ты справляешься с задачами определённой сложности - ты растешь и похуй что ты всего пол года работаешь. Даже если прошло 3 года, а ты всё еще джун, значит ты тупой ты на своем месте.
>Коллектив какой? Не бывает ли конфликтов? Дружелюбные ли?
По деффолту, все очень дружелюбные, трудно быть быдлотой и кодить одновременно. Конфликты могут быть только по рабочим вопросам и то они больше смех вызывают.
>Как проходит собеседование? Тяжело ли было?
Первое - очень волновался, последующие на раслабоне. От тебя не требуется внимательности, просто будь собой, твои знание сами всё сделают если они есть.
Спасибо. Ты довольно сильно обнадежил меня и успокоил.
А ты с чем вкатывался? Изучал самостоятельно?
Решил вкатываться в дата аналитику, когда это даже не было мейнстримом. Итого, сам дома выучил запросики SQL, внезапно ексель, и буквально немножечко питона, на уровне первых 10 уроковэто было очень важно, чтобы дать понять что хочу развиваться. На собесе спросили меня:
1. Обьяснить что такое join в sql и зачем он
2. формулу ВПР из екселя
3. Понимаю ли я что делает продукт компании. Да этот вопрос будут задавать часто, чтобы понять насколько ты адекват.
Считай вкатывался я с 0. Мат образования - не было.
Самостоятельно изучал, какие-то рандомные курсы sql и обязательно задачи на сайте sql-ex. Послушал курс по Data science на курсере. Звонил бывшей коллеге в моб.оператор, она стала нач.отдела уже, говорит что нету джунов с хорошим знанием SQL. Уже полгода не могут найти. Я в геймдеве - у нас так-же, искали джуна, приходит куча народу но с SQL мало. Кароч в первую очередь учи запросики и дерзай.
Даже не знаю что посоветовать, я хуевый советчик в этом плане, проходил курсы и читал стак. И ты тоже так делай.
По сути - у меня не было никакой специальности когда я вкатывался.
Меня засунули учиться на финансиста, но я и дня ним не проработал. И не смог бы. После выпуска 4 года откисал дома, родители выпирали работать, пошел устраиваться дата аналитиком, начитался много о этом. До этого прошел кучу курсов дома. Не прошел 2 собеса. Подтянул то на чём сыпался, и смог пролезть аналитиком в FMCG. Очень заебывали на собесах вопросом что я делал 4 года после выпуска- отвечал, что фрилансил. Это отчасти правда, но фрилансил не по аналитике.
Как сказать, тех ключевых областей чтобы комфортно чувствовать себя в айти и развиваться - на должном уровне или вообще, в курсе не было. Да может были какие-то интересные моменты по эконометрике но не более. Да и вуз далеко не топовый был.
>>668566
Никогда не помнил этого. Да и сейчас не вспомню. Стараюсь забыть тот период. Когда вношу куда-то инфу о годе окончания вуза, бомблю +\- 2 года.
Не знаю, может это чисто у меня такое, но заметил такую вещь, что в большинстве случаев работа с sql это тоска смертная. Какие-то смердящие данные, лежащие в тысячах таблиц, которые создал прошлый творец, благодаря которому всё это надо джойнить и тащить. Круг задач на sql крайне узкий, при этом приходится сидеть и пердолиться с хранимыми процедурами на этом весьма посредственном синтаксисе.
Куда бы я не копнул, в какую бы сторону не попытался смотреть, где есть большое присутствие SQL - везде тоска смертная. Тот же Power BI и прочие иже с ним производят впечталение какого-то переоценнённого говна вроде О СМОТРИ ТЕПЕРЬ ТУТ МОЖНО ДЕЛАТЬ ТАКИЕ ЖЕ НЕСКУЧНЫЕ ГРАФИКИ КАК В ACCESS/EXCEL В 2007 ГОДУ!
Как вы находите себе интересные задачи там? Идёте в банк и становитесь аналитиками? Или по кайфу пишете запросы, достаёте данные бэкендерам/фронтам и отдаёте их, заваривая очередной чай? Пришёл на проект, где всё очень сильно завязано на sql, с тысячей таблиц, масса из которых будто бы делалась наспех и чтобы быстрее работала. И просто тоска смертная, сидит тимлид, во всём этом разобравшийся и агитирует вникнуть и разобраться других, чтобы и дальше плодить в этом монстре триггеры и хранимые процедуры сидя на сервере 10 версии.
Фсмысли, узкий круг? а само число таблиц разве не показывает, что число видов сущностней записанных в этой базе широкое?
Потом, наверное твой текущий проект денег приносит нихуево.
Если так скучно, поди напиши мобильный клеент к нему. Это многим нужно, но они (справедливо) считают что это слишком дорого
Как обычно, в 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
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
>а само число таблиц разве не показывает, что число видов сущностней записанных в этой базе широкое?
Ну да. А что толку? Можно нескучно джойнить благодаря фантазиям архитектора, когда отчёт собирается из нескольких баз данных и это типа я эскуель девелопер?
>Потом, наверное твой текущий проект денег приносит нихуево.
Ну, скажем так, он просто не сможет жить. Но даже программисты там часть звена, и даже не центровая, по сути. Просто руководство не захотело один раз потратиться на готовое решение, поэтому начали городить велосипеды, в итоге это всё превратилось в пранк, вышедший из под контроля.
>Если так скучно, поди напиши мобильный клеент к нему. Это многим нужно, но они (справедливо) считают что это слишком дорого
Есть уже. Околобесполезная вещь оказалась. Потому что специфика бизнеса такая, что никому не нужно.
Первая зп - 600$ кажется, отдел отчётности, Киев, 2014\2015 год, но там просто череда везений была после с повышением и внезапным переходом в другой отдел. Так-что даже не буду описываить.
Вот есть JSON. Можно представить что это либо строка, либо число, либо массив, либо объект (условно).
А теперь берём это определение и создаем под него нормализованную схему БД - то есть по отдельной таблице для каждого типа (строка/число/массив/объект) и таблица которая маппит конкретное значение в конкретный тип.
Это что получается, я изобрел монгу поверх реляционки?
На самом деле, в том или ином масштабе можно изобрести что угодно поверх чего угодно. Реляционная поверх key-value. Древовидная поверх реляционной. Key-value поверх таблицы из одной строки с полем TEXT. Было бы где хранить байтики и чем их обрабатывать. Жёсткий диск же как-то всё хранит в одном линейном массиве.
Аномалии могут наблюдаться только при наличии > 1 запроса в транзакции, или с 1 запросом тоже может быть (например когда вложенный select или join)?
Заебись тогда. Спасибо!
>Решаем всем тредом лабы для заплутавших студентов и задачки с sql-ex для тех, у кого завтра ПЕРВОЕ собеседование
Крч есть книги, есть категории. Связь many-to-many
books, categorys, books_categorys
Вывести пары книга-книга у которых более 5 общих категорий
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.
Спроси в php-треде, и сразу приложи ссылку на pastebin с твоим кодом
Как только научишься писать там SELECT'ы разной сложности, рекомендую для изучения теории курс на Stepik, там будут рассмотрены вопросы проектирование схемы, нормальные формы, и мб даже транзакции.
Да, норм, я эти курсы и имел в виду.
Для начала сойдут.
Что изучать после этого - пусть подскажут другие аноны. Да и это зависит от того, куда ты хочешь пойти (DBA или разработка приложений).
Аналитик, у меня вышка с экономикой/финансами вообще связана, сейчас смотрю в вакансиях много где надо с базами уметь обращаться.
Мне кажется, что для аналитика достаточно умения выполнять хитроумные SELECT'ы со всякими агрегированиями, window-функциями, рекурсивными CTE и pivot (это как раз то, чему учит весь sql-ex) , а пректирование схем их не очень касается.
Но пусть лучше тебе аноны-аналитики подскажут.
Если я просто девелопер без знания SQL, который пишет только OLTP, мне нужно учить все эти пивоты и рекурсии? Или во всякой вебне, которую я буду писать, в основном все попроще?
другой анон
Плюсану к этому вопросу.
Сам я от нечего делать нарешал 350+ задач на sql-ex, но хотелось бы знать, насколько всё это нужно обычному бэкенд-разрабу.
Вообще, я общался на эту тему с одним php-разрабом, он сказал, что у них всё через ORM. А значит, никаких advanced-фич.
Но один случай ничего не значит.
Глубоко задрачивать что-то дальше джоинов смысла мало. Обычно если реально что-то понадобилось, это легко гуглится и сразу же изучается.
Анон, двигай в сторону data science или в кровавый интырпрайз. Выбери что нравится: на очередном собрании с заказчиками пиздеть, что данные были сырыми и всё проёбано, или что индусы опять нахуярили ебанины, и ваш отдел качества опять проебал все сроки. Но уже за 200-300 тыщ в секунду.
Посоветуйте книгу по темам event/domain driven systems
Бамп
Ты выставляешь меня в невыгодном свете.
Ty
В чем сделана схема на скрине?
Искал средство визуального построение схем БД, и чтото не нашлось годного. Есть красивый 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.
Чёт больше ничего не взлетело, а за овер 30 лет могло бы. Даже ORM подражают SQL.
Да это я набросил просто.
Уже читаю, спасибо.
Redis и Postgres работают через сокеты, мне вот интересно: их обычно ставят на том же серваке или относят на другой удаленный серв? Просто хуячить дополнительный HTTP-request к стороннему ресурсу это пиздец в плане быстродействия
Так кто-то делает?
>>700594
Есть у меня 2 проекта: бот для телеги и веб-кроулер (пока тестировал их только на своей машине в localhost). В обоих юзается Postgres а в одном еще и Redis (для очередей). Мне же нет никакого смысла для таких небольших проджектов хуярить БД на отдельном ресурсе? Лучше на тот же сервак залить?
> Лучше на тот же сервак залить?
Конечно лучше. Пока у тебя нет проблем масштабирования так и надо делать
Вообще у меня курсач "агенство по трудоустройству", я хз что делать с типом занятости, типом зарплаты и т.д. - ебнуть их в enum или в другую таблицу? Если в другую таблицу - джоинов много, при этом данных не много, к тому же они явно будут индексированы. Да и enum в реляционной алгебре - явно просто еще одно отношение...
Че делать то?
обычно на отдельной единице исполнения. И что? Надо мерять важно это или нет.
Хорошо бы, чтобы http были не серийные, последовательного ожидающие ожидающие ответов,а логически-законченные запросы к какому-то "мидлваре" , application server И тд.
В принципе и с sql та же проблема.
Многие программисты ужасно удивлялись, когда их приложение на дельфи перенесенное из локалочки в интернет, начинало тормозить.
Противоположный конец - встраиваемые в программу субд: sqllite, berkleydb, библиотека innodb, embeded mysql (впрочем, его похоронили) .
Там действительно все не так как привыкли, нулевые накладные расходы на обмен.
enum подойдёт
Чтобы быстро работал поиск, делай индекс по нему.
В твоём случае отдельная таблица никакого выигрыша не даёт, да и непонятно, какие атрибуты тебе нужны в таблице полов, кроме названия.
Пиздец дедлайн скоро уже
Есть кто работал с SQLite?
У меня в таблицах первичным ключом будет поле с GUID вместо числового с автоинкриментом.
Подскажите, как лучше таблицы создать с опцией WITHOUT ROWID или без нее в этой ситуации?
Это опция позволяет делать поле, которое является первичным ключом, кластерным индексом.
Без этой опции у каждой таблицы создается числовое поле ROWID которое и будет счиаться кластерным индексоа.
Так вот
Как у них в документации написано
https://www.sqlite.org/withoutrowid.html
Что стоит использовать WITHOUT ROWID когда ключевое поле не числовое и когда строки не занимают очень много места.
Также эта опция уменьшает ускоряяет поиск и уменьшает место занимаемое строкой за счет того что нету поля ROWID.
Но говорят что использование гуида в качестве кластерного индекса повышает фрагментацию на диске и что база разбухает быстро от этого
Правда это статься про MS SQL Server, не знаю насколько это применимо к SQLite
https://www.sqlskills.com/blogs/kimberly/guids-as-primary-keys-andor-the-clustering-key/
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 предложения.
> DELETE FROM BALANCE ORDER BY AMOUNT LIMIT 1;
delete from balance where amount = (select amount from balance order by amount limit 1);
Ну тли min()/max()
>>703216
Да, но мне же еще нужно сохранить 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;
с ORDER BY и LIMIT он упорно не хотел работать.
Возврат пустой выборки - не ошибка, и исключения не будет.
То же самое с delete и update, если записи не найдены.
Блин, где объясняется чтение подобных таблиц для СУБД? Куча стрелочек, причем какие-то с треугольником и кружком на конце, а какие-то с кружком и линией
Нет, просто в Oracle EXCEPT называется MINUS.
https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries004.htm
Тебе нужна предпоследняя точка в строке, не нужно проверять число вхождений
Select поле1, поле2... фром... агрегатные функции...where...
И есть условие:
Where поле1 in (массив_значений)
Мне нужно чтобы результат был сгруппировано (group by, ага) по этому условию.
Т.е. две строки получалось, с одними и теми же столбцами, но в одной поле1 удовлетворяет условию, в другой нет.
Конечно, можно сделать 2 запроса, но ведь как-то можно сделать и одним?
Прочитал ещё раз вопрос и вроде понял.
Делай
GROUP BY CASE WHEN поле1 IN (...) THEN 1 ELSE 0 END
Я не понимаю - что значит сгруппировано по этому условию?
Может быть
SELECT (CASE WHEN field1 IN [] THEN 1 ELSE 0 END) AS conditon
GROUP BY field1?
>Where поле1 in (массив_значений)
> в одной поле1 удовлетворяет условию, в другой нет.
Выбери что-то одно. Тебе нужна не фильтрация (where), а флаг показывающий состояние по этому условию
Ну рекурсии могут пригодится не только для аналитики (иерархия комментов с пагинацией, например), но к целом дрочить много не надо, надо знать минимум и идти дальше и от задач строить своё обучение
Такое дело: есть две таблицы. Одна таблица — сколько вошло, вторая — сколько вышло. Мне нужно как-то придумать, чтобы сопоставить вторую таблицу с первой по принципу 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
>>704777
>>704787
>>704821
>>704832
Спасибо за ответы. Коллега помогла с решением.
With (массив значений) as table
select поле1 in table as условие, поле2... фром... where...
group by условие.
И получается, то, что я хотел, за один запрос.
Не знал, что можно делать CTE из массива значений, и то, что через IN и Group by вот так можно делить, я точно бы никогда не догадался.
Надо было больше задачек решать на sqlex, эх. Чувствую себя тупым.
Много лет его использую, но недавно меня уж очень больно опустили по поводу уровней сериализации транзакций, фантомных чтений wala и прочей хрени.
К тому, же, я видимо пропустил много крутых фич, вроде skip locked.
Что читать/смотреть по этим двум направлениям?
Бамп
SELECT name, age
FROM "/users/alan/folder1/table1"
WHERE age >= 18
Используй жс, так понятнее будет
Ясно нубас
Тебе не sqlex решать нужно, а скилл русского подтянуть, половина анонов не поняли что ты спросить то хотел.
На Линухе я просто заходил через sudo psql и мне было поебать, сейчас на винде (pgAdmin установлен если что, но он не сильно помогает) при попытке приконнектиться через терминал командой psql появляется вот эта залупа: psql: ВАЖНО: пользователь "Антон" не прошёл проверку подлинности (по паролю). Как подконнектиться-то? (нового юзера с помощью CREATE ROLE Антон WITH LOGIN PASSWORD 'password' я уже создал, но толку никакого, psql меня не признает)
Твоя задача непонятна.
Если в id=1 вошло 3, а вышло 2, то почему осталось 2?
И да, если ты считаешь число вошедших/вышедших, а не их самих, то какой там порядок (FIFO/LIFO) не имеет значения.
Нужно совместить ID входов с ID выходов. Если количества на входе не хватает, то разбить на две записи.
При помощи оконной функции sum из table_in и table_out делаешь интервалы
Для table_in:
ID IDX_START IDX_END
1 1 3
2 4 6
Для table_out:
ID IDX_START IDX_END
1 1 2
2 3 4
3 5 5
Потом берёшь все интервалы из table_in и table_out и попарно пересекаешь.
ок, иди нахуй, сам разбирайсмя со своим говном тогда.
чот проиграл, руснявое говно оказалось, не в кодировке, а за клавиатурой.
Спасибо.
В pg_hba пользователь прописан? Или any?
Вот допустим есть две таблицы:
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_IDINT 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_IDINT 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 следующей позиции в зоне) и таблицу-связку для хранения информации о том в какой позиции находится соответствующий элемент. В чём тут профит я не понял, но наверное какой-то должен быть.
Так как лучше будет, чтобы быстро, безопасно и без дедлоков?
Вот допустим есть две таблицы:
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_IDINT 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_IDINT 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 следующей позиции в зоне) и таблицу-связку для хранения информации о том в какой позиции находится соответствующий элемент. В чём тут профит я не понял, но наверное какой-то должен быть.
Так как лучше будет, чтобы быстро, безопасно и без дедлоков?
Я так понимаю надо использовать запрос и ещё внутри подзапрос. Но с синтаксислм что-то не получается
Ну это примерно соответствует моему первому варианту.
А что будет в том случае, когда кто-то будет читать данные из таблицы, по которой идёт этот 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, шаг 1.
2. Транзакция 1, шаг 1.
3. Транзакция 1, шаг 2.
4. Транзакция 2, шаг 2.
В итоге получится, что после первой транзакции список 1, 2,3 ... 100 превратится в 1,2,3,..99, а вторая транзакция превратит его в 1,2,...99,101. Ну и само собой это не единственный вариант такой коллизии, могут быть ещё в варианты с присвоением одного и того же номера двум элементам одновременно.
Ну это примерно соответствует моему первому варианту.
А что будет в том случае, когда кто-то будет читать данные из таблицы, по которой идёт этот 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, шаг 1.
2. Транзакция 1, шаг 1.
3. Транзакция 1, шаг 2.
4. Транзакция 2, шаг 2.
В итоге получится, что после первой транзакции список 1, 2,3 ... 100 превратится в 1,2,3,..99, а вторая транзакция превратит его в 1,2,...99,101. Ну и само собой это не единственный вариант такой коллизии, могут быть ещё в варианты с присвоением одного и того же номера двум элементам одновременно.
select ★ from (select ★ from my_table where a < param_1) where a > param_2;
Но зачем? Результат будет такой же, как без подзапросов, через and.
>Какой правильный синтаксис, если я хочу взять сначала из таблицы все записи меньше параметра_1 а из полученных данных взять только записи больше параметра_2?
>Я так понимаю надо использовать запрос и ещё внутри подзапрос. Но с синтаксислм что-то не получается
Почему нельзя объединить эти два условия в одном запросе:
WHERE
[Table1].[Field1] < @Param1
AND
[Table1].[Field1] > @Param2
>А про скорости?
SQL - это декларативный язык, ты пишешь ЧТО ты хочешь получить, но не пишешь КАК и не пытаешься быть умнее, чем оптимизатор запросов.
Почему тогда в вакансиях пишут "навыки оптимизации SQL-запросов"? Сейчас не вспомню где именно, но несколько раз точно попадались.
>Почему тогда в вакансиях пишут "навыки оптимизации SQL-запросов"
>>710066
>ты пишешь ЧТО ты хочешь получить, но не пишешь КАК
Здесь нет противоречия. Даже если тебе требуется переписать запрос таким образом, чтобы он быстрее выполнялся, то ты всё равно пишешь это в декларативном стиле, чтобы оптимизатор запросов построил более выгодный план выполнения, напрямую план выполнения ты не контролируешь (почти).
Анон, будь добр, линкани ссылку на тренировочную базу для изучения функционала sql server
Благодарю.
Что до сих пор нет нормального набора операций из реляционки. Вам бы лишь юбилей двухзначного номера версии отпраздновать поскорее. ГДЕ МОЙ SUBTRACT БЛЯДТЬ?!
Тогда почитывать матчасть на досуге. Главное не перегореть, заливать работу личным временем говнопрактика.
Если я сделал SELECT с припиской ORDER_BY а затем отфильтровал этот упорядоченный дамп записей через SELECT WHERE то получившийся ответ так же будет упорядочен, или надо сновая юзать order by?
Снова надо писать.
Поэтому order by бесполезен везде, кроме самого внешнего select, за исключением использования вместе с limit или с чем-то подобным.
>Если я сделал 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 снова вернёт нам таблицу, т.е. неупорядоченный набор данных. Строго говоря в зависимости от реализации ты можешь получать и упорядоченный набор данных в некоторых случаях, но рассчитывать на это нельзя.
>>712043
>Поэтому order by бесполезен везде, кроме самого внешнего select, за исключением использования вместе с limit или с чем-то подобным
И что особенно важно бесполезен в представлениях (VIEW).
>просто заблокирует мне эти строки, но не защитит меня от ситуаций, где другая транзакция вставляет строки, которые тоже подпадают под это условие, что в свою очередь может привести к нарушению целостности данных.
Бамп вопросу
SELECT
CASE WHEN '00:00:00' >= '00:00:00' THEN 1
ELSE 0
END
Он сравнивает побитово? Или как-то магическим образом понимает что это время?
>Он сравнивает побитово? Или как-то магическим образом понимает что это время?
На этапе компиляции определяется тип строкового литерала.
>>712657
>умаю, стоит ли городить проверки в запросах и в коде ради возможной производительности, или тупо обновлять объект целиком, при этом написав меньше говнокода
Вариант с обновлением всех полей может оказаться даже быстрее, т.к. запрос на обновление меняться не будет и его план выполнения прокешируется.
>Использую андроидовскую орм Room
Сильно зависит от реализации этой штуки, но я бы не задумывался об оптимизации раньше времени.
А что мешает merge делать?
В `хуи` где-то 30к записей (у всех есть ид), в `пезды` 120к (у всех есть ид), в `хуи` есть 20 id, которых нет в `пездах`.
Такой джоин (можно просто на иннер заменить, не важно) занимает 4 секунды:
select from хуи
left join пезды on пезды.ид=хуи.ид
where пезды.ид is null
а такой джоин - 4 минуты:
select from хуи
left join пезды on пезды.ид=хуи.ид
Как так получается, что из-за всего 20 ид, которые джоинятся с нуллом, запрос начинает значительно дольше работать?
Пардон, не то написал, первый запрос выглядит вот так, вопрос тот же:
select ★ from хуи
left join пезды on пезды.ид=хуи.ид
where пезды.ид is NOT null
>хуйней в МуСкле, объясните пожал-ста
С мускулом не работал, но по слухам у вас там есть команда EXPLAIN, выполнив которую ты получишь ответ на свой запрос.
https://habr.com/ru/post/31129/
>>712899
Хмм, на основе EXPLAIN сделал такое предположение:
так как при джоине столбец пезды.ид расширяется несколькими Null, то index на пезды.ид перестает работать, так как рассчитан только на not null.
Но это хуйня какая-то, я думал сначала по индексам все достается, выполняется джоин и уже потом идет null-extension для строк справа.
но ведь хуев гораздо больше пезд и пезды очень придирчивы.
Несколько вопросов, антонсы.
1. MSSQL Always On бывает без листенера? Или подразумевается, что в always on кластере он всегда существует, даже если я не использую балансировку нагрузки (селектов)?
2. Допустим у меня есть готовый кластер MSSQL Always On и есть другая, отдельная бд MSSQL без всяких кластеров, к которой подключено приложение.
Мне надо с минимальным простоем это приложение перекинуть на always on. Соответственно, мне надо как-то перенести данные из старой базы в новый кластер.
Опять же, если с минимальным простоем приложения, то мне нужно заранее как-то зазеркалить/отреплицировать/что-нибудь старую базу в новый кластер. А потом я просто ткну в приложухе, мол конекться не к старой БД, а к новому кластеру и оно сразу законектится и заебись.
Так вот, как мне зазеркалить БД с кластером, чтоб в кластере были те же данные?
С меня 5 кило гречки
При иннере проблемы не будет. Но нужен лефт к пездам справа, да и разобраться почему так происходит хочется.
Мы тут гадать должны три треда?
Неконструктивно обсуждать запросы без плана. Слишком много вариантов.
Отфильтруй сначала в CTE, а потом ебани свой жоин.
Объясню на примере. Пусть есть такие таблицы:
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#, если что.
Объясню на примере. Пусть есть такие таблицы:
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#, если что.
Все-таки сожрались пробелы. Тогда так. Есть пик1, как получить пик2 ?
Сука ебланская про иннер джойн прочитай одну страничку блядь а не спрашиай на двачах сука
даже не одну страничку блядь а достаточно строчек 10 описания и пару примеров, чтобы понять как оно работает еблан сука
И как мне иннер джойн здесь поможет?
Отвечай давай, или сука ебланская, еблан, сука и так далее здесь только ты.
Мне нужно, чтобы строки были как бы объединены, не было повторов, если такое возможно. На примере - по услугам. То есть в первом столбце - наименование услуги, во втором - все сотрудники, к этой услуге относящиеся. То есть ФИО находятся в одной ячейке, и всего строк в получившейся таблице столько, сколько имеется услуг.
Как здесь одним иннер джойном обойтись, раскроешь секрет?
Ебать ты далбаеб братишка.
пиздуц от суда нахуй, пока не обоссали
Аноны не помогайте этому тупому, агрессивному чухану. Мало того что в гугле забанен, так еще и хамит.
мимокрок
Боюсь, что такое средстами Access не сделать.
Если бы была более навороченная СУБД, то можно было бы примерно так:
1. Джоинами делаешь таблицу
Наименование услуги | ФИО сотрудника
2. Делаешь string_agg/group_concat/listagg/костыль через конверсию в xml (зависит от СУБД) на ФИО сотрудника. группируя по наименованию услуги.
Возможные грабли: услуги с однаковыми названиями, услуги без сотрудников, решение надо будет чуть подкорректировать.
>Боюсь, что такое средстами Access не сделать.
https://stackoverflow.com/questions/5517233/ms-access-query-concatenating-rows-through-a-query
Подскажите, почему при соединении двух таблиц вывод получается с дублями? У них разное число строк, может в этом дело (хотя у одной таблицы 4 строки, у другой - 2, а на выходе их 6.)?
>В итоге получится, что после первой транзакции список 1, 2,3 ... 100 превратится в 1,2,3,..99, а вторая транзакция превратит его в 1,2,...99,101. Ну и само собой это не единственный вариант такой коллизии, могут быть ещё в варианты с присвоением одного и того же номера двум элементам одновременно.
Бамп вопросу
Если уж хочется без явных блокировок, то думаю, что стоит посмотреть, как делается lock-free linked list в памяти и попробовать то же самое реализовать в БД: ведь CAS там есть.
Но неужели нельзя просто брать блокировку на весь плейлист?
>>714791
>>714804
Спасибо.
>>714769
Я и сказал, что не знаю, как сформулировать запрос гуглу, чтобы выйти на то, что мне нужно. Попросил подсказать, ни к чему не принуждал. И в итоге на меня наехал какой-то дурачок, который даже не разобрался, в чём суть. Всё, что я сделал - ответил ему тем же и поставил на место с его советами не по делу. А тот и замолчал - спесь сбилась, видимо. Ну ничего, будет думать в следующий раз и подбирать выражения, если не нравится, когда действуют его же методами.
Не считаю, что был не прав. И агрессивный здесь точно не я.
Завести таблицу с id всех плейлистов,
При модификации элементов одного брать блокировку на строку из этой таблицы.
Строить логику не на изменении записей, а на выборке. Делать rn по дате обновления например, в таком случае обновленные будут иметь 1, а более старые 2. Т.е. перенести логику на уровень возврата результатов, а не на уровень самой таблицы. Можно делать по двум полям порядковй номер и дата обновления.
>При модификации элементов одного брать блокировку на строку из этой таблицы.
У меня нет возможности блокировать отдельные строки. Сейчас я обхожусь тем, что блокирую (UPDLOCK) все данные в плейлисте (технически в таблице-связке между плейлистами и песнями), откуда идёт перемещение, и в плейлисте, куда идёт перемещение, но это не защищает меня от того, что другая транзакция вставит туда данные. Я пока думаю над тем, чтобы создать некластерный индекс на столбец с id плейлиста и позицией в нём и блокировать данные с UPDLOCK,HOLDLOCK.
Интересуют в первую очередь процедуры и вью. Кто, когда и что.
>Как грамотно отслеживать изменения в бд?
>Интересуют в первую очередь процедуры и вью. Кто, когда и что.
Гугли по слову audit, в зависимости от используемой СУБД должны быть средства подписаться на события создания/удаления/изменения объектов БД (а так же выдачу прав и всё остальное, что тебя может интересовать). После этого регулярно читаешь этот лог и делаешь замечания программистам, которые забывают внести информацию о том, что они поменяли хранимку или вьюшку в связи с таким-то тикетом в комментарий в её заголовке и/или закоммитить скрипты.
> Как грамотно отслеживать изменения в бд?
Сменить пароль, поставить git и дженкинс, настроить CI/CD, просить кидать МР на себя.
https://cloud.mail.ru/public/TaUD/hHeVNeWwx
СУБД какая? Это важно, так как функции работы со строками зависят от СУБД.
Может ли между значениями быть несколько пробелов?
> Postgresql
Думаю, эта функция тебе поможет:
split_part(string text, delimiter text, field int)
https://www.postgresql.org/docs/current/functions-string.html
Тогда такое могу предложить:
https://www.db-fiddle.com/f/t4DohQY557vL1fs4gnRoML/0
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;
Во, это уже ближе к тому, что я хочу. Теперь осталось добиться того, чтобы ещё вывелась строка:
col1 col2
suka d
Тогда такое
https://www.db-fiddle.com/f/t4DohQY557vL1fs4gnRoML/1
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;
Рекомендую порешать задачи на sql-ex, чтобы легко щёлкать такие задачи.
В 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;
END$$
DELIMITER ;
GROUP BY ip не сработает, потому что тогда он возьмет только первую посещенную страницу, даже если посещено было несколько
Ну я ж ньюфаг.
SELECT COUNT(DISTINCT ip) FROM table GROUP BY page
сработал. Это то же самое, что и двойной GROUP BY?
Что за принцип читатель-писатель?
Это как read-write блокировка: Или это producer-multiple consumers, где один процесс создаёт записи, каждую из которых должен обработать только один из потребителей?
Балтика девятка
Проиграл
Охуенно сформулированный вопрос, учитывая, что а авс дохуилиард сервисов.
Мой внутренний прорицатель осознал, что вопрос задан в треде бд, а потом послал тебя нахуй.
Кину вам на карту 200р (хахах, я понимаю это мало, но больше не могу дать) за помощь в одном деле, работы максимум на 10 минут.
У кого есть возможность и желание помочь, пишите в телегу:
@vovafist
нет, кстати за 2 дня никто не откликнулся, было две простые задачи на выборку. (спросите почему я их сам не решил, я был на работе оба дня)
Потому что всем лень писать тебе в телегу.
Написал бы задачи тут, можно чуть в видоизменённом виде - поменяв названия таблиц и столбцов, быстро бы получил ответ.
И вот я решил что поскольку тема баз данных очень обширная, то можно будет какое нибудь направление исследовать и написать выпускную работу
Аноны, может вы можете предложить какую нибудь тему? Или может кто уже писал подобные работы
Отвечаю в треде про постгрес не про постгрес, но для себя в базах данных я нашёл https://github.com/mit-pdos/noria.
Интересная поделка, которая оптимайзит запросы, храня у себя materialized views для тех запросов, что ей уже встречались. В README репозитория есть ссылка на пейпер, на мой взгляд, про это можно интересно рассказать.
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 для следующей итерации.
Анон, на какой стул сам сядешь, на какой мать посадишь?
Мои же мысли по этим пунктам таковы:
1) тип придется генерить инсерт insert into tmp_some_ids (id) values (${stored_ids[0]}), (${stored_ids[1]}), ... (${stored_ids[CHUNK_SIZE-1]) что как на мой взгляд залупа полная.
2) выглядит норм, но хз как на уровне mysql норм не норм, по сути он передрачивает один и тот же запрос много раз формируюя чанки (возможно я не прав).
3) выглядит тоже норм, но надо делать все время лишний запрос чтобы все врямя получать самый большой айди во временной таблице.
Тогда мы получим уникальные пары столбцов page, ip и их count, что будет соответствовать количеству посещений с каждого ip на каждую страницу.
>>723585
>>723707
Типо того - это НЕ ТОЖЕ САМОЕ что и group by page, up и это то, что тебе нужно - ты группируешь строчки по имени страницы и дальше для каждой строчки считаешь количество уникальных айпишников в визитах.
Пилишь динамический запрос который выбирает нужные поля по шаблону их системных таблиц.
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name = 'Foods'
AND table_schema = 'YourDB'
AND column_name LIKE 'Vegetable%'
Да.
Делаю сейчас задание
мой код: https://pastebin.com/zNR1ymSh
правильный код: https://pastebin.com/nFYxdG0w
Результаты выходят идентичные, но проверку не прохожу. Не могу понять, в чём мой косяк? Потому что не добавляю в группировку e.store_id?
Вопрос: как наиболее эффективно протестить такую таблицу на наличие бесконечно рекурсивных связей, то есть чтобы подкомпонент хуйни C не мог являться компонетом A?
Это нзывается развязка many2many.
Отдельная таблица из двух полей - айди шпециалиста и айди организации из соответствующих таблиц.
Как именно работает та же Postgres? В качестве демона? Я когда установил ее у себя в Убунту и работал с ней посредствам Django ORM, никогда напрямую ее не запускал... Это Джанго под капотом "запускает" сервер Postgres или порт 5432 (по умолчанию) доступен с самого начала старта ОС?
Да, сервер запускается системой как служба, у тебя только клиент.
Что-то лень вникать, но на первый взгляд различимые в групбае, в эталонном примере, берут ещё 2 поля, т.е. если у тебя по этим полям будут другие значения, у тебя будет больше строк.
Это рили для совсем начинающих? Ты не шутишь? Капец.
Тредик кого на ютабчике посоветуете для погружения?
Храни тебя нормализация, спасибо
По какому принципу лучше всего организовать структуру БД? (Postgres, если что) ManyToMany к подкатегориям, каждая из которых имеет ForeignKey на одну из категорий? Или это нерационально? (постов в распоряжении несколько тысяч, в некоторых случаях поле category может канешн быть null, но это встречается редко)
Да таблица категория и таблица подкатегория. Ну вобще задача попахивает мдм системой
Товарищи, возникло желание поискать себе подработку-халтуру.
Что-то такое, что будет занимать пару-тройку часов в будние дни и столько же в выходные. У меня коллеги - админы, так и работают - все время на основной работе + какое-то время на второстепенный проект.
Но проблема в том, что я как админ хорошо если чуть выше джуна. Мне приходилось и сейчас приходится иногда выполнять администраторские задачи, с терминалом и unix проблем нет, но человек который занимается этим профессионально сделает эти задачи быстрее и качественнее.
Мое направление больше соотвествует - системной разработке и архитектуре на стыке БД и ОС, оптимизация, немного етль.
И вот вопрос: можно ли по своему направлению найти part-time подработку или фриланс, на каких сайтах-ресурсах лучше искать? Если все-таки искать подработку по админским задачам, то где лучше смотреть варианты, на каких источниках?
Смотрел upwork и freelance.ru но там дичь какая-то одна по типу правки экселек. Может неправильно искал.
На этапе создания таблицы нет смысла проверять констрейнты на наличие, потому что их гарантировано не будет, поэтому по твоей ссылке об этом ни слова нет.
Двачик я смог, было сложно с агрегатными ф-ями и соединениями, но вроде одуплил что там куда.
следующий этап sql-ex
работаем.
>где поясняют разницу между SQL и NoSQL
Это будут две книги.
Первую прочитай от корки до корки и прям зубри нахуй. Это компьютер саенс, там есть по базам всё что только нужно.
Та шо с кабанчиком - это по NoSQL. Там во второй главе вроде было сравнение, но для него тебе надо изначально понять тонкости sql.
Пойми их и будешь крутым челом. Этого в универах часто не учат, к сожалению =.=
Достаточно навернуть вводную к какому-нибудь MongoDB, чтобы понять для чего нужен NoSQL. Читать эти книги я бы не рекомендовал. Одна слишком большая и нужна разве что только разработчикам СУБД или архитекторам, а вторая - это такое попурри из различных нескучных статеек.
Надо пробросить порт.
А лучше настроить сеть как bridged и у виртуалки будет свой айпи в локалке.
Хостинг с ВМ вообще в ебенях находится, а не на моей машине
Просто я ебался какое-то время в консоли, а потом узнал что есть pgadmin. Когда поставил postgres на своей машине на localhost:5432 то спокойно коннектился к серверу через pgadmin. А если ВМ далеко и я к ней через ssh по ключу коннекчюсь? Что в конфигурации на серве надо настроить чтобы меня не дропало при попытках коннекта, фаэрвол тот же?
Нужно подсчитать количество записей в таблице с группировкой по неделям. Всё бы хорошо, но если данных за конкретную неделю не было, то в результате запроса не будет номера этой недели значения 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)
Используй generate_series для генерации списка недель и делай left join с имейлами
У меня есть несколько запросов из разных таблиц, которые выводят количество или сумму нужных мне данных по месяцам.
В каждом запросе есть колонка с месяцами.
Мне нужно горизонтально объединить запросы, чтобы вывести все колонки со всех запросов. Только вот в некоторых запросах нет определённых месяцев. Джойнить их не выйдет, так как нет общих полей.
> В каждом запросе есть колонка с месяцами.
> Джойнить их не выйдет, так как нет общих полей
Чем месяц не общее поле?
Меня постоянно попускают на собеседованиях на вопросах по SQL. Есть какой-нибудь годный тренажер и книжка, которая бы популярно объясняла язык SQL и его хитрости?
Такой супер вопрос, надеюсь поможете.
В общем вкатываюсь в БД, начинаю работать с MSSMS и в самом начале охуел с такого момента. Как создавать отношения таблиц как вообще проектировать БД. Кого почитать или посмотреть грамотного что бы доходчиво объяснил про нормализацию БД, отношения, про Primary Key и все остальное. В общем буду благодарен за любую инфу.
Мне помог https://www.youtube.com/user/VladimirMozhenkov Но я не говорю что я все понял и теперь у меня идеальные бд.
Чот у него помойка какая-то га канале, кинь линк на плейлист по бд, есди под рукой
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 начал работать один проект назад.
Так ёбана, у тебя между таблицей с приборами и таблицей с разрешениям связь то есть?
https://www.youtube.com/watch?v=EHvzvwAv7RU&list=PLY7PmJJFH5nT-lbFKxfbp3rw5BBuq5Azo
порядок нарушен и вообще его нет
Да, забыл написать.
Сделал через один запрос всех разрешений, дальше разруливаю в памяти — получается меньше секунды. Может и не буду городить всё через запрос.
Залил таблицу на 3кк строк, но PostgreSQL почему-то как-то странно выборку делает: каждый раз при одном и том же запросе выдаёт в основом следующие строки через N строк, либо некоторые из них вообще перемешивает.
Грешил сначала на DataGrip, потом на место на диске, но это всё не виновато.
Есть идеи, куда копать?
Уточню, что когда в таблице было меньше 200к строк, такой хуйни не было.
Так же только что залил в MySQL, там всё хорошо работает,
>select id from records limit 20 offset 500;
всегда выдаёт айдишники с 501 по 520, не перескакивая случайным образом на следующие строки.
limit/offset без order by может выдать всё, что угодно.
Так что это никакой не баг, а вполне допустимое поведение.
У меня сейчас 10 лет разработки улетели в другую галактику php-макака. Спасибо за разъяснение, вопрос закрыт.
Ну ёбана, если данные хранятся в КУЧЕ(heap), они ПРОСТО лежат, и бд дастёт их как ей вздумается, да и вобще юд всегда дастёт как ей вздумается, едис ты другого не попросишь. Если нужно доставать быстро и в нужном порядке, ордер бай, индексы, вот это всё.
Делаешь лефт жоин маленькой таблицы к большой, нулевые поля заполняш NEVER, в селекте при помоще CASE заполняшь премитед\нот премитед
О себе:
Активно изучаю БД / прохожу курсы уже несколько месяцев, в резюме на hh уже есть несколько сертификатов по sql и python. Сейчас прохожу длинный курс "аналитика данных" от яндекс.практикум.
30+ лвл. ДС. Опыт работы - не релевантный, но работа аналитическая в финансах (без программирования).
Хочу быть Bi-аналитиком или аналитиком БД, для начала.
Стажёром в 30+ лет не вариант идти, да и вряд-ли возьмут. Откликаюсь на все, что плохо лежит (где-то 50 откликов за 2 недели), резюме смотрят, но ни на одно собеседование так и не позвали. Есть идеи куда и как можно вкатиться?
Консалтинг всякий - глоубайт (туда легко попасть), EY или банки - сбербанк, втб.
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.
Алсо, считаем что диапазоны разрешений сделаны правильно, данные корректны и в них не может быть мусорного гавна
Спасибо, анончик, попробую, как доберусь до офиса.
Я пока сделал всё быстро в памяти, но хочется разобраться в твоём примере
Добра тебе.
чот при таком подходе можно говна поесть, если у него есть пересекающиеся пермиты
>>746987
Вот как-то так
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
FROM one
where rn=1
>>746987
Вот как-то так
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
FROM one
where rn=1
Ну анон говорил что одно из полей нужное ему КОММЕНТАРИЙ, его группировать нельзя же.
хотя конечно можно через МАХ сделать
Мне показалось, что там нет никакого поля, но нужно самому выдать сконструировать и выдать такой атрибут. Иначе да та прав, нихуя не выйдет и надо будет делать cte
теорию, не тренажеры
Есть какая-то уникальная колонка. Есть ли разница между запросами?
> SELECT unique_column FROM table_name;
vs
> SELECT DISTINCT unique_column FROM table_name;
Ну основании чего колонка уникальна? Если просто от предметной области, то distinct будет дополнительно эту уникальность проверять. А иначе, возможно, планировщик запросов будет достаточно умным и поймёт что уникальность нет смысла проверять тк она обеспечена другими средствами
Уникальный индекс. Спасибо.
Анон, подскажи, знаешь ли ты хороший сборник задач по SQL? Желательно, интерактивный.
А то на предыдущем собеседовании дали задачу быстро написать запрос, а я обсренькался, аки пидр
Код первого способа:
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;
pivot?
1. Elem.find().distinct('field') // получить выданные элементы где значение field отличается и взять число этих элементов.
2. Elem.findOne().sort('field' : -1) и получить значение field.
В данном случае эти операции будут индентичные.
И это при условии того что есть index.
Как я понимаю, поиск максимального элемента по отсортированному дереву это O(log(n)).
С другой стороны, подсчёт элементов в дереве это O(n).
То есть лучше должно быть O(log(n)), то есть второй варик. Правильно или нет?
Да вопрос был для даунов, но я его не осилил: есть три таблицы.
В одной имена, во второй книги, в третьей взятые первыми книги. Нужно было быстро написать запрос таблицу только в общей схеме нарисовали, с чем я и не справился.
Хз, м.б. если бы у меня перед глазами были хотя бы таблицы, то я бы смог.
Писать нужно было в чате скайпа, а не в sql-е.
>первую прочитай от корки до корки
Бесит огромное количество воды и самоповторов. Чувство такое, что Гарсиа этот специально зачем-то объём раздувал до тысячи страниц.
мне кажется тут проблема что ты не знаешь ЧТО делать. Задачи тебе помогут понять КАК, а первое помгоет понять теория.
хм, я бы попробовал циклом это решить. Навскидку можно потыкать через row number либо через курсор. Я конечно сам ещё тот погромист, но за твои конкаты я бы тебя обоссал на собеседовании.
Пожалейте меня, хочу вскрыться.
СУКАБЛЯДЬ зачем нужен второй способ, если есть GROUP_CONCAT ?
ебаные собеседователи. Что они хотят этим добиться?
Не влезает результат? ТАк поди и почитай где эта настройка в mysql меняется. Ахуели вообще.
Ебучая задача, список в строку через запятую? Совсем охуели
Оказывается, бекап был еженедельный...
у меня лид недавно проебался, часть записей проставлялась дата '0000-00-00', а он забыл про них и удалил старые записи вместе с ними.
а что не так? функция есть. значит она кому-то нужна.
неудобно на клиенте делать group_concat
это я тупой или задачи?
почему в таблице указывается имя, но в двух строчках указанны классы. Там в "проверочной" версии вопросов все так же?
Думаю сделать столбцы event_type и event_date, адекватный ли это способ для хранения статистики, учитывая, что в день может быть порядка миллиона событий?
БД постгрес, менять нельзя
Нет, такие вещи не надо в постгре хранить, бери другое хранилище
Для аналитики - может быть, но если ты занимаешься подобный в oltp- как будто что-то пошло не так
То есть, для тестов было бы отлично иметь возможность копаться в БД, удалять/обновлять/писать новые данные, для ДЕВовского сервера тоже самое, но что бы раз в какой-то период времени моя копия получала "обновления" с прода и данные в ней жёстко перезаписывались на новые.
Есть для этого что-то готовое или проще написать самому такую штуку?
Лол. У мамкиных архитекторов сработала нейросеть : клики - значит clickhouse.
Миллионы байтиков в день - это ведь не так много.
Остоновись. Подумой.
Просто пишешь раз в пару недель админу в аську : Василий, нам бы базу в дев залить дамп прода.
Единственный верный вариант решения данной проблемы. Сейчас бы аналитику складывать в медленные постгрес, который ни в кластеризацию ни в шардинг не умеет. Я еще не говорю про медленные запросы и жор ресурсов (в том числе дискового пространства). Если у тебя какой-нибудь заурядный круд для односельчан, то можешь брать реляционную СУБД. А когда тебе нужно хранить аналитику и делать хитрые запросы, которые будет отрабатывать моментально, то тут нужно уже думать и выбирать более совершенные решения.
Хотя, если ты считаешь, что сотни миллисекунд на простые запросы это норма, а отсутствие шардинга, распределенных запросов и кластеризации в 2к20 является обыденностью, то ок, можешь дальше пихать своего слона в проекты.
Слон в детстве укусил?
Для кликов точно не стоит городить своё, когда уже есть специализированные и проверенные решения с готовой обвязкой. Для большинства проектов pg достаточно.
Да еластики хватит за глаза
Абсолютно верно, нахуя тащить реляционку со всеми ее нормальными формами, ролбаками и транзакциями чтобы просто хранить, никогда не менять, читать и агрегировать ссаные логи?
Хотел бы автоматизировать процесс и не трогать никого.
Я тут и одмин и разработчик и автоматические тесты пишу.
Ты просто не понимаешь как устроен тот же кликхауз. Твой предел это пилить круды на похапе и мускуле, лол.
нет никакого потолка и линейного развития.
Может это мой стартап и я деньги на пидорасов-программистов не хочу тратить? У тебя свои ориентиры, а у меня свои. Ты можешь целиться в свой Яндекс, но мне это не надо.
Если я понимаю, что данные за 10 лет уместятся в арендованный сервер 3 Тб сервер, а чтобы агрегация происходила быстро, нужно просто это делать заранее и регулярно, нахера мне Кликхаус?
Не, ну любая репликация только добавит тебе регулярных проблем.
Девопс - добавит ебических проблем.
Чем тебя не устраивает написать скриптец для дампа и закачки?
Можешь даже как-то разбить таблицы на части и вручную добавить условия к дампу, чтобы в наиболее объемных таблицах старые данные не дампились.
В свете этого, почему бы не просить админа, пока он сам не автоматизирует?
Так а что аноны рекомендуют?
Ты наркоман?
ты ебанутый тормозной mysql workbench называешь "воркбенчем"?
тогда посмотри бесплатный (для России) mysql dbforge studio
Есть некая большая таблица, мне нужно исключить записи удовлетворяющие сразу двум условиям. Ну например где место = Jopa и цена in (20,30,40).
А, он только для винды чтоле, ну блин.
Как мне получить json подобный список
{user1:{phone1,phone2},user2:{phone4,phone6}}
Это средствами языка собрать сначала список всех пользователей (собрать для них их телефоны и объединить это в нужный) мне или sql сама может так сделать?
Ты хочешь из плоской структуры (таблицы) получить иерархию ккстомного вида. Зачем? Это же вьюха, работа для ORM.
Делай джойны и мапь строки в память моделек
Я пытаюсь разобраться и решил перепроверить свои догадки, что в sql это не сделать. Поскольку изучаю сам есть неуверенность в том что полностью понимаю и не пропускаю какой-то функционал, вот и переспросил у коллективного разума
Спасибо за ответ :)
Ну смотри - ответ на запрос в реляционную базу это всегда набор строк, содержащий значения столбцов и/или их производных. Эти производные могут быть любыми - кастомные строки, цифры и так далее. Но это все равно будет набор строк.
Просто сделай join и дальше направляй результат в модель в ккком хочешь виде - посредством ORM или ручками
хз, чот результат не похож не правду.
Образно:
-с фильтом НОТ(исключить) 1000 строк
-без фильтра 1500
-Берем реверс фильтр, без NOT 100 строк
Как вставить ручную SQL миграцию перед последней? Допусть можно пустую сгенерить через Add-Migration и потом вставить свой SQL код в Up и Down. А как ее впихнуть чтобы она перед последней автоматической выполнялась? Можно конечно файл переименовать чтобы таймстап изменить, но как-то криво.
Там какие-то сакральные знания требуются, или бомжам с улицы зеленый свет?
Сам-то как думаешь?
нужно знать все те системы, которые ты собрался интегрировать и ETL-ить.
Занятна штука. Расскажи кто тебя заставляет ее изучать?
Там есть интеграция питона и какие-нибудь простейшие модели машоба? текстовые преобразования характерные для датасаенса (они называют это NLP)?
Чем отличается роль от юзера? Как нужно распределять пользователей по базам данных? Как всё это должно быть связано с пользователями в Линукс? Почему не стоит работать с ролью postgres и зачем она тогда вообще нужна? Что НА ПРАКТИКЕ означают разные аттрибуты, наподобие суперюзера, админа и чем они отличаются друг от друга?
В книжках просто постулируется однозначно и объяснение идёт сразу дальше.
Попутно ещё такой вопрос: как внести человека в таблицу, дав ему при этом уникальный id? Как его вычислять?
> Чем отличается роль от юзера?
Роль - это что-то вроде профессии внутри одной системы. Разным ролям можно делать только какие-то конкретные действия и нельзя делать ничего другого, просто из соображений безопасности. Ну и роли привязаны к конкретным юзерам (иногда их может быть больше одной). Например, юзер с ролью "двачер" может читать и писать посты, а юзер с ролью "моча" может делать всё то же + редактировать/удалять посты двачеров или банить двачеров.
> Как нужно распределять пользователей по базам данных?
Например, таблицы: юзеры, юзеры-роли, роли, роли-действия, действия.
> с пользователями в Линукс
Там примерно то же, но действия крутятся вокруг файлов, а роли называются группами. Но это просто аналогичная модель, связи с базами там нет.
> как внести человека в таблицу, дав ему при этом уникальный id? Как его вычислять?
Считай, что в базе для каждой таблицы хранится по отдельной переменной-счётчику и написана простенькая функция, которая при каждом добавлении в таблицу записи устанавливает её поле id равным следующему значению счётчика.
Можете рассказать стори своих собесов, какие вопросы были вообще, и какие "каверзные"?(хотя каверзность это скорее относительно, но все ж)
Алсо, любая инфа по вкату на должность дба приветствуется.
ну и про вилки, если можно(мзл)
Мимо-вкатываюсь-ибо-заебало-сидеть-в-техподе-за-60к
Ну пока не заставляют, есть несколько стульев на выбор Rest APi, Apach kafka,Apache nifi. Первые два стула очевидно для пограмистов, а судя по описанию nifi, там уже ближе к бд и скулю. NIfi точно будлет юзатся в связки с касандрой, ну и ещё возможно собирать всякие данные со сторонних систем, пока не знаю подробностей, но стул выбрать нужно.
Мне кажется самый быстрый способ получить списоквсех таблоиц, прогнать через 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?
Если второй вместо транкейта юзай:
delete from TABLENAME where Proj_ID is not NULL
Мне кажется самый быстрый способ получить списоквсех таблоиц, прогнать через 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?
Если второй вместо транкейта юзай:
delete from TABLENAME where Proj_ID is not NULL
> execute_command("BEGIN");
> for (int i = 0; i < 9000; ++i) execute_command("INSERT INTO...");
> execute_command("END");
Работало очень быстро. Сейчас пытаюсь тот же код вызвать в майкрософтовском SQL сервере — BEGIN и END отдельными командами он не воспринимает, и работает очень медленно — на то, что раньше требовало 5 минут требует множество часов.
Что делать? Использовать синтаксис мультивставки, генерируя многомегабайтовые SQL-запросы?
Это ты ещё 100 лет одиночества не читал.
Ну так у тебя наверное коммит идет после каждой записи
Генерь не на каждый элемент как insert into, а сделай ее вначале и генерь список values значений которые в инстерте вставояешь, это будет быстрее.
На mssql еще гугли bulk insert, на постгресе тоже есть такая тема гугли copy
Я постепенно на работе вкатываюсь в 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
Подскажите, пожалуйста.
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
Подскажи, как решать такую задачу?
Мне кажется, или тут действительно нужно пилить процедуру с if-условиями?
А как ещё можно задать условие "если в результате селекта не найдено 2 значнения, то пишем null?"
Спасибо, завтра попробую
Что-то вроде:
Дата - ID - Категория - Цена
Мне соответсвенно нужно вычесть все товары категории А из Товаров Категории Б, по датам.
Ну например 2020.01.01 продали 3 из категориии А и 5 из катеогррии Б, мне нужно получить строчку 5-4.
2020.01.01 - 2
with govno
as
(
select
salary,
rank over (order by price DESC) rnk
from salary
)
SELECT
coalesce(NULL,salary) as SecondHighestSalary
from govno
where rnk=2
*RANK() OVER(ORDER BY salary DESC) as rnk
На работе есть 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 ;
У меня есть подозрение, что оно вообще не работает.
Поправил пробелы.
Никаких, по БД спрашивать особо нечего.
- пример запроса с group by
- пример с join left и inner
- с having
- с CTE
- что такое индексы и нахуя, cons and props
- partitions
- connections
Юзать их - бэд практис и расходится с принципами чистой архитектуры, например, впрочем иногда удобно конечно, от задачи
Как вообще понять, какие метрики для потгресса нормальные?
У меня вопрос по мелкософтовскому серверу относительных баз данных. Есть такой запрос: https://pastebin.com/3DUrsG5S
Почему у меня задачи в планировщике имеют статус Runnable - No? И видимо поэтому они хотят исполняться в заданное время.
В чём может быть затык?
Мне может вообще наоборот надо читать, с конца этот учебник, вдруг всё встанет на свои места? К самому sql-ex претензий нет но вот такая чехарда это что-то новое для меня.
2 секунды много в любом случае, если только это не аналитический запрос с кучей джоинов, агрегатов, подзапросов и cte
Мимо php мидл
Или быстрее запрос выполняется если данная фильтрация уже идет в блоке where?
Все это есть на ютубе абсолютно бесплатно, так же можно скачать книги, по ним тоже отлично учиться материал, есть сайты с практическими задачами и они тоже бесплатные, если тебе некуда деть деньги, дай их мне
мне кажется разницы нет в производительности нет, сервер сам оптимизирует план запроса, а вот в выдаче могут быть различия.
Да я знаю что он есть бесплатно, я хочу узнать есть ли курс лучше
Оптимизатор поймёт и сведёт к единому фильтрацию в ON и WHERE но только в случае если они эквивалентны, что конечно же происходит не всегда, например left join, да
Высоконагруженные приложения (клепманн).
Тебя интересуют вторая и третья глава - реляционные бд, документоориентированные бд, графовые бд, столбцовые бд.
Также может заинтересуют 10 и 11 глава - пакетная обработка, mapreduce, потоки событий
Кто первый заговорил о перекате - тот и перекатывает.
Анон, я тупой и мне нужна твоя сила. ЛЮБАЯ ПОДСКАЗКА.
Есть таблица, где пишутся логи юзеров
действие-роль-имя-datetime
нужно в виде вьюхи представить эту таблицу по типу
9.00 18 августа - Иванов
9.00 18 августа - Петров
9.05 18 августа - Иванов
9.05 18 августа - Петров
9.05 18 августа - Сидоров
Где с шагом 5 минут будут имена тех, кто в это время был active(не совершил logout)
Попробовать юзануть оконные функции. Или написать процедуру, которая будет бежать циклом по оригинальной таблице и подсчитывать то, что тебе нужно, а вьюха будет вызывать эту процедуру.
А есть что то кроме sql ex?
> перекатывать треда
Сложна
> Написать MERGE с десятью джоинами и рекурсивными подзапросами
Изи.
Таблица большая7
А хули ты тогда ебёш вола? Просто делаешь джоин по этому полю, и у тебя оджна строчка - это ссесия, с временем начала и временем конца. Если нужно по отрезкам порезать джоинишь к календарю, с нужными отрезками времени
Да говорю же, тупой! Сказывается конец рабочей недели. Вот так как-то вышло, анон.
https://pastebin.com/nB19m7Es
Сейчас календарь еще таблицей накидаю, чтобы к нему джоинить, а то вьюха не переваривает чот переменные. И спасибо за помощь.
Чем сложно перекатить? И скопировать ОПпост отсюда
Так?
перекатился из админки в аналитику. Я всегда знал что админка днище, но когда из неё ушёл до конца осознал какое.
Как перекатывался? Сколько админил? Какой лвл?
Предлагаю собрать стачечный комитет и не отвечать ньюфагам.
Функционал веб-приложения реализуется через браузер, полностью поддерживает расширения CSS и полный набор HTML-тегов, а также отсутствует привязка к стандартной библиотеке. Обеспечена концепция детализации и перекрестная фильтрация. Встроен аппарат статистики и анализа данных, возможность построения 3D моделей. Обеспечена высокоуровневая защита данных через соответствие паттерну.
Сап, аноны. Заранее прошу простить, если не по теме пишу, просто хз, куда ещё писать. Нужен человек, которых разбирается в PL\SQL
типа, есть задание, которое идёт вместо экзамена, а у меня нихуя не компилируется, ошибки в коде, а сам исправить не могу, ибо тупой
Это всё не бесплатно, конечно. Если есть тут умельцы-молодцы, то в ответе на пост пишите контакт в телеге
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)
Но вот как сделать их чередование я хз. Так что либо помогите допилить мое решение, либо тупо скиньте свое, в любом случае поклон вам в ноги
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)
Но вот как сделать их чередование я хз. Так что либо помогите допилить мое решение, либо тупо скиньте свое, в любом случае поклон вам в ноги
Вы видите копию треда, сохраненную 24 января 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.