В этом итт ай-ти треде собираются все любители Баз данных, гордо именующие себя айтишниками. Доказываем друг другу, что >SELECT ID FROM b_entity_tvoya_mama это тоже программирование, Креэйтим индексы на одно и то же поле по 100 раз и инклудим в них всякие поля на всякий случай, Храним gender в NVARCHAR(2000), Поясняем, как можно без задней мысли хранить бизнес-логику в бд, а не в приложении, Рассказываем, как обновлять хранилище данных актуальными real-time данными раз в минуту, Называем логично и понятно поля в логичных и понятных таблицах >CREATE TABLE tablica_s_clientami ( >ID_CLIENTA INT NOT NULL >IMYA NTEXT, >"DATA ROJDENIYA" NVARCHAR(MAX)) Ну и, конечно же, выбираем лудшую СУБД для всего: MY SQL MS SQL PostgreSQL ORACLE MongoDB SQLite Excel И даже Google Docs! В общем, это очередной баз данных тред.
>>973979 Кстати, да, никогда не понимал, почему у всех языков программирования есть один тип данных string, а в Бд char nchar varchar nvarchar text ntext хуита какая-то.
>>973990 В С++ как минимум три типа "строк": std::string, char* и char[].
Разница в основном будет при оптимизации перформанса. Исторически, если тебе был известен размер одной записи, и этот размер был фиксированным, ты мог очень просто выбрать n-ную запись просто сместив указатель.
Если размер записи варьируется - хуй ты так всё просто сделаешь. varchar(max) и text в современных базах как правило - синонимы.
>>974059 тебе надо захуячить полнотекстовый поиск по полю name таблицы продукт. Альсо, в квере должен быть использована функция to_tsvector и to_tsquery.
>>974064 >>974062 Понял, спасибо. Буду пытаться. Чот сложный этот ваше Postgres.. Я прост хотел SQL потренить, а они мне хуйню свою пихают, я бы лайком заебашил и все, епта, похуй на оптимизацию.
>>975203 А что там сложного: http://rextester.com/YAFPJ99445? Считаешь сумму в окне от первого до текущего кортежа, отсортированном по месяцу для предсказуемого результата. God bless Oracle.
>>975271 Да, я nullif для нуля проебал. >>975272 SQL Cookbook для начала. Дальше зависит от того, каким именно диалектом пользоваться будешь. Для Оракла ничего лучше Тома Кайта нет, наверное.
>>975268 Вообще-то, оконные функции - это T-SQL, они не реализованы только в уебищном MySql, но это уже проблема этой субд, что она не поддерживает станадрт полностью. Умение использовать оконные (аналитические) функции тебя на любом собеседовании на разработчика бд/аналитика по отчетности спросят, гарантирую, как опытный ходитель по этим самвм собеседованиям.
>>975552 >>975526 А вот и toxic-чмохи без конструктива подкатили. Вместо того, чтобы человеку помочь, только пердите в лужу, мамины админы mysql на localhost.
>>975526 Во-первых, AS опциональный в SQL-92. Во-вторых, это дело принятого в вашей компании код-стайла. В-третьих, единственный аргумент в пользу этого бесполезного говна мамонта — backward compatibility, в моём случае это неинтересно.
>>975552 Выполни-ка select log(x, 0) from dual. Это ты бесполезный, а не nullif.
>>975356 nullif должен быть вокруг аргумента log(), чтобы в случае, если он равен нулю, подставлялся null. А нужно это потому, что логарифм от нуля не существует — нет такой степени, в которую надо возвести основание, чтобы получить ноль.
Довольно много работал с фаербердом. Под него есть божественная ide ibexpert. Решил познакомиться с постгресом, посоветуйте что-нибудь хорошее на подобие.
>>975742 От какого значения ты собрался защититься своим нуллифом? От нуля? А почему не от -18? Ну а про AS такой глупой макаке даже и пытаться пояснять бесполезно.
>>977639 Ну это понятно. Но вот это нормально вообще >Count: 3230567 >Time: 5.378092123s Два запроса, select count() from table и select from table where condition like '%пизд%';
Ещё попытался занести результат select max(code) from pc в переменную через DECLARE, чтобы к ней потом обращаться, но беда в том, что sql-ex.ru почему-то требует, чтобы мой запрос начинался с SELECT'a.
>>977961 Пивот от анпивота не отличаешь? >>977964 Нет в постгресе того, что тебе нужно, делай с юнионами. И код отдельно тебе не нужен, нужно выбрать требуемую строчку (с тем самым кодом) и с ней работать.
Анон, поясните за постгрес. Им кто-то сейчас пользуется? Какая у него сфера деятельности, для чего его лучше использовать, чем он лучше мусклес? Я просто из кейсов только сервер для аллодов онлайн видел и все.
>>978392 когда создаешь новый дневник создай секвецию с идентификатором дневника, затем при добавление записи в дневник номер записи бери из секвенции.
Поясните, пожалуйста. Есть таблица, пикрелейтед. Как выбрать строки например со значениями "меньше .200" после точки перед последним значением? Как вообще выбирать такие строки, если критерий выбора - значение конкретной части строки, причем не точное, а в заданном диапазоне, н-р "от 100 до 200"?
>>979155 в селекте сплить строку потом в тайм стэмп дату транкуй в 1970-ый год, в кондишан части фильтруй по тайм рэгджу, затем в селекте добавь вывод оригинального столбца, вот тебе и нужный вывод.
>>979181 в лайте вообще нет смысла заморачиваться с любой обработкой. это все всеравно на части сервера, который читает файл выполнится. поэтому если бэк енд вменяемый, то делай все там.
>>979183 >>979181 >>979180 Думаю, мне проще сразу мокрософт SQL-сервер накатить. Этих таблиц будет штук 30, и все они 500+Мб csv файлы. Спасибо еще раз :3
>>977953 Как же я бугурчу от таких задач, типа транспонируйте таблицу, заебашьте сводную sql-запросом. Вот нахуя это реализовывать заебным PIVOT/UNPIVOT в mssql, может есть субд где pivot легкий и удобный? ? Я конечно может слегка тупой, но в сотню раз проще выгрузить все в эксель и вертеть таблицы как душе угодно. По сути, кроме группировки и джойнов sql не нужен. мимо-аналитик
>>979317 Очень просто (надеюсь, что, что такое хранилище, рассказывать не нужно), это называется инкрементальной загрузкой данных. Для этого в первоисточнике (откуда грузим в двх а к а HRANILISHЕ) должен быть признак того, что запись изменена - update_date или же нужна уверенность в том, что данные в первоисточнике статичные и вовсе не меняются, а только добавляются новые, причем с идентификатором-инкрементом (Identity), в таком случае нам не нужно каждый раз грузить все 10000000 строк, а выбрать из них только те, у которых update_date >= update_date той же сущности у нас в хранилище. (Или id источника >=id в хранилище), теперь, когда мы их выбрали, нам нужно все это дело смэтчить (в скл сервере для этого юзают MERGE) но можно и обычными update - insert с проверками на существование записи у нас в хранилище. Если есть - апдейтим, если нет - инсертим.
>>979359 А если данные нужны не аналитику, а какому-нибудь другому приложению с доступом через API со строгой спецификацией? Тоже Excel-файлик отдавать будешь? Нет, ты используешь анпайвот при необходимости, чтобы привести их в треюуемый вид для удобной обработки back-end приложением.
>>979361 Давай подробности о построении SSIS пакета. Insert там есть оче быстрый, это все круто, update же - увы нет. Наиболее оптимальный вариант который удалось нагуглить - делать Staging таблицу, отправлять туда данные которые надо будет проапдейтить, а потом из нее выполнить batch update. Но блин, это получается на каждую мигрируемую таблицу надо иметь свою Staging таблицу, какое-то не очень хорошее решение. Вообще стремно что разрабы SSIS такого не предусмотрели, либо ест ьсекретка какая?
>>979392 Держи. Я юзаю такой шаблон для инкрементального обновления. Есть бд Staging, как ты правильно отметил, есть боевая с полными данными. В стеджинг сущности, как раз, грузятся кучосками по update date или id. Есть таблица staging_entity, в которой хранится описание сущностей и их последние даты и айдишники (опционально)обновления, чтобы на их основе строить запрос к источнику. Add new staging entity - добавляет новую сущность в таблицу на основе переменных, которые не воези в скрин с айпада на рдп. Import started и import finished - небольшие скрипты, которые просто пишут системное время сервера для логов. Staging prepare - процедура, к которой на вход отправляется айдишник сущнсоти staging_entity, в сотстветствии с которым определяется таблица в стеджинге, которую нужно очистить перед заливкой в нее данных. staging import - дата флоу, в котором подставляется полученная из get import details последняя дата обновления сущности (или айдишник) через экспрешены в виде "SELECT id, update_date, name, value FROM ololol WHERE " + (а тут переменная, которая тоже делается через экспрешн, который мне западло писать, но, думаю, ты и так поймешь), В результате получается "SELECT id, update_date, name, value FROM ololol WHERE update_date >= '20170101 14:03:21'" Ну и результат этого запроса уже грузится в стейджинг. attempt succeded/failed - скрипты, которые проверяют, успешно ли прошел импорт. Если безуспешно, то в лупе (bulk insert attempts) начинается новая итерация после пятисекундного ожидания, вдруг подключение недоступно было некоторое время?) main load - процедура, которая грузит данные из стейджинга уже в хранилище. В основном, это мерджи, состоящие из when matched then update, when not matched then insert Import failed - тоже для логов. Finilize import - процедура, которая выбирает из стеджинга последнюю дату обновления (или айдишник) и пишет в таблицу с сущностями в стейджинге, из которой их в следующем запуске опять прочитает get import details.
Инб4: ошибка в датафлоу - всего лишь следствие того, что это шаблон для пакета, в котором еще не настроено подключение.
>>979446 Правильно ли я понимаю, что пакет со скрина выполняет обновления по разным таблицам (представленным в staging_entity)? Эдакий универсальный скрипт?
Еще такой вопрос по перформансу. Как часто запускается пакет и сколько по времени выполняется?
>>979446 И еще такой вопрос. У тебя заведены отдельные скрипты для формирования записей в лог. Пользуешься ли тем что SSIS генерирует сам? Я имею в виду вьюху catalog.operations и catalog.operation_messages в базе SSISDB. Или скрипты логирования просто пишут дополнительную инфу помимо того что предсотавляет SSIS?
>>979475 >Правильно ли я понимаю, что пакет со скрина выполняет обновления по разным таблицам (представленным в staging_entity)? Эдакий универсальный скрипт?
Нет, такого в ссис не завезли, так что по этому шаблону создаются новые пакеты (их можно объединить по сущностям, если у них одна дата обновления, например, "документ" и "пакет документов" из 1С, тогда пакет один, а в датафлоу сразу несколько движений данных. Но, в основном, просто до хуя пакетов.
>>979479 Скрипты, конечно, свои, ибо так удобнее и все кастомизируемо. Пакеты добавляются пачками в другие пакеты, которые имеют название hourly_updatable_tables или daily_updatable_tables, например. А те, в свою очередь, уже запускаются соответствующими джобами по требуемым расписаниям.
>>979475 А по времени работы: Если нету ебанутых НЕОБХОДИМЫХ полей с джейсонами и иксэмэлями длинной по 50000 символов, то грузится все очень быстро - буквально секунд за 15. Но, все равно, это отстой, ибо по дефолту двх обновляется 1 раз в день, а такая вот хуйня приводит к локам, которые выстраиваются в очереди: пока кто-то там что-то селектит из твоей таблицы, хер ты ее смержишь, а после мерджа кто-нибудь опять уже хочет выполнить селект и т.п. Но реалии бизнеса требуют вот таких вот танцев вокруг пепелища.
>>979490 Это да, у нас в организации выставлено требование - пакеты должны запускаться раз в 15 секунд, соответственно время выполнения должно быть совсем маленьким. Сейчас удалось свести время выполнения к 3 секундам, благо что новых данных не так много.
Появилось у меня желание создать процекдуру для мониторинга одной очень важной хрени. Суть - есть некоторые данные. Эти данные должны равномерно распределятся по некоторому набору таблиц. Мне нужно знать в состояние каждой порции данных. Т.е. в каждой таблице могу быть записи с определенным id - первое состояние Данные с этим id есть в некоторых таблицах - вторрое состояние Данных с таким id нет ни в одной из таблиц - третье состояние
Пока таблиц всего 10 штук. На интуитивном уровне я понимаю что делается это просто - надо просто по очереди проверить есть ли в каждой из таблиц нужный id, потом срапвнить число положительных ответов с числом таблиц и вернуть один из трех ответов. На каком нибудь шарпе я бы это написал за 5 минут. Но вот на sql что то не соображу как это реализовать.
>>979693 Если хочешь сварганить динамически на уровне sql-сервера, то в помощь динамик sql. Я так понимаю, количество таблиц будет только увеличиваться.
Делаешь таблицу с таблицами (лол), далее делаешь переменную @sql_query nvarchar(max) = 'SELECT 1 WHERE EXISTS (SELECT 1 FROM ' Далее херачишь цикл, в котором проходишь по строкам созданной таблицы и имя таблица добавляешь к переменной, а потом вызывешь этот запрос с сам через EXEC sql_query или через EXEC sp_execute_sql, ну а дальше ты, думаю, разберешься.
>>979621 Так то да, но если объемы данных на каждой инвокации пакета будут расти то и время выполнения будет увеличиваться. Ну и спрашивал еще чтоб сравнить как у других, а то DW и прочим связанным начал заниматься в текущей конторе и опыта еще маловато.
Вопрос про группировки по времени. Есть некоторая таблица заказов, заказы распределены по времени не равномерно. Задача: 1. Сгруппировать суммы заказов, скажем, по дням 2. Поскольку распределение не равномерное то могут быть дни когда заказов не было совсем, однако в конечной выборке должны присутствовать все дни без перерывов, а напротив тех дней в которые заказов не было ставить null 3. Выборка может быть отфильтрована по любому из полей таблицы заказов
Нашлось решение через подзапрос (или еще пизже через CTE). Делаем основной запрос с группировкой по дня, получаем на выходе почти готовую выборку но с пропущенными днями. Далее результат обертывается как подзапрос (или же вьюха в CTE) и к нему джойнится непрерывный список дней (либо генерим на лету, либо берем из таблицы времени), т.о. получаем как раз то что нужно. Однако может есть еще хорошие решения?
>>980360 Двачую, однако принято наоборот делать. Сначала рекурсивно создаем времянной диапазон, удовлетворяющий нашим нуждам, а потом к нему лефт джойном прихуячиваем сгруппированный подзапрос (или врем. Таблицу) с заказами. Все ок.
>>980623 Да шибко разницы нет. Один пакет на все. Внутри него под каждую сущность заведены Data Flow, выполняющие запрос из источника, сравнение с данными в DW и перенаправление на insert или update. Запросы тягают только новые данные по timestamp. В особо плохих случаях новые данные определяются сравнением колонки версии, хрень в том что у каждой записи свой номер версии (другими словами он не сквозной) из-за этого приходится тягать все данные (id и та самая колонка версии) и сравнивать с таковыми в DW. Тут и возникает некоторый оверхед. Благо что такое встречается не во всех сущностях. Через staging и batch update работает только одна сущность, наиболее критичная к перформансу и времени выполнения. Все датафлоу выполняются последовательно-параллельно. Т.е. большей частью датафлоу раскиданы так чтобы выполняться параллельно, но в случаях когда одна часть зависима от другой то такие датафлоу выстраиваются в последовательную связь. Данные вытягиваются хранимыми процедурами размещенными в оперативной базе. По одной процедуре на сущность. Вывел даже самые простецкией запросы не отличающиеся большим объемом кода - для единообразия.
Вот как-то так. Возможно несколько сумбурно, но ты задай наводящие вопросы, постараюсь ответить.
И с группируй это так, что бы на выходе получить выборку date, sum 2017-04-01,44 2017-04-02,null 2017-04-03,20 2017-04-04,30 2017-04-05,null 2017-04-06,null 2017-04-07,89
Как видно в исходной таблице нет данных за 2,5 и 6 число, но по задаче в конечной выборке эти числа должны присутствовать с null или 0 значением.
>>980803 А ну элементарно, проходишься циклом по дате в диапазоне от (дата) до (дата). Если в таблице таких дат нет, то присваиваешь полю sum нулевое значение. Теперь в запосе все это опиши (мне лень). Там сложный многоуровневый запрос будет Гугл в помощь
Посоны бдщики, поясните за ммошки, как я понял там все персонажи хранятся в бд. Статы, опыт, лвл, это всё ясно, но как хранятся предметы? Неужели там тейблы "айди игрока/айди шмотки", это же миллионы миллионов записей для того же ВоВ. Или они хранят шмотки в файлах и как-то загружают их для игроков? Хранят несколько баз данных или там и одной хватит? Я в вопросе бд почти ноль, но интересно стало. А ведь ещё есть квесты, банки, гильдейские банки. Интересно услышать что вы думаете.
посоны, как внести изменения в таблицу из 3х стобцов если 1й стобец играет роль идентити, он же является PK, 2 столбец - рандом текст хуета, 3й столбец - FK с референсом на 1й столбец - PK.
задача - изменить данные в 3м столбце, куда тыкать для результата:?
>>981698 что такое граф ниибешь? вощем это базы, заточенные под операции над графовыми структурами. в случае запроса "выбери мне всех пользователей, которые у меня не в друзьях и которых я не игнорю, но которые имеют со мной общие связи" реляционная базочка охуеет просто, в то время как структура гсубд позволит выполнить его без самых больших проблем
Кто мне согласен как тупому ОБЪЯСНИТЬ одну из задач с sql-ex? Я вроде понял КАК она решается, но не понимаю ПОЧЕМУ именно так. если оставите контакты, сброшу условие полностью
Схема БД состоит из четырех таблиц: Product(maker, model, type) PC(code, model, speed, ram, hd, cd, price) Laptop(code, model, speed, ram, hd, price, screen) Printer(code, model, color, type, price) Таблица Product представляет производителя (maker), номер модели (model) и тип ('PC' - ПК, 'Laptop' - ПК-блокнот или 'Printer' - принтер). Предполагается, что номера моделей в таблице Product уникальны для всех производителей и типов продуктов. В таблице PC для каждого ПК, однозначно определяемого уникальным кодом – code, указаны модель – model (внешний ключ к таблице Product), скорость - speed (процессора в мегагерцах), объем памяти - ram (в мегабайтах), размер диска - hd (в гигабайтах), скорость считывающего устройства - cd (например, '4x') и цена - price. Таблица Laptop аналогична таблице РС за исключением того, что вместо скорости CD содержит размер экрана -screen (в дюймах). В таблице Printer для каждой модели принтера указывается, является ли он цветным - color ('y', если цветной), тип принтера - type (лазерный – 'Laser', струйный – 'Jet' или матричный – 'Matrix') и цена - price.
Задание: 14 (Serge I: 2012-04-20) Найти производителей, которые выпускают более одной модели, при этом все выпускаемые производителем модели являются продуктами одного типа. Вывести: maker, type
Решение типа такое: SELECT maker, min(type) AS type FROM product GROUP BY maker HAVING COUNT(DISTINCT type) = 1 AND COUNT(model) > 1
Результат на пике.
Я понял, что min(type) возвращает "Laptop". Но до меня не доходит как далее работает >HAVING COUNT(DISTINCT type) = 1 >AND COUNT(model) > 1 И почему в конечном итоге правильный результат такой, какой он есть? Как это получилось из взятия минимума по типу? Объяснение на форуме читал и не понял всё равно. У знающего человека спрашивал, вроде дошло сначала, но вот сегодня снова потерял в голове логику.
>>982457 Ну вроде ничего сложного. Для начала поменяем кое-что.
SELECT maker, min(type) AS min_type FROM product GROUP BY maker HAVING COUNT(DISTINCT type) = 1 AND COUNT(model) > 1
Запросы эквивалентные, просто чтобы не путаться. Если бы у нас не было HAVING, то мы бы просто получили всех производителей и ещё какой-то тип. HAVING - это тоже самое, что и where, только ещё с агрегирующими функциями умеет работать (после WHERE отрабатывает).
COUNT(DISTINCT type) - количество типов аппаратуры. Т.к у нас группировка по производителю, то количество типов аппаратуры, которыми занимается производитель. COUNT(DISTINCT type) = 1 - производители с единственным типом производимой аппаратуры
COUNT(model) - количество моделей аппаратуры. Т.к у нас группировка по производителю, то количество моделей аппаратуры, которые создаёт производитель. COUNT(model) > 1 - производители, с количеством производимых моделей больше одной.
min(type) - это просто финт ушами, чтобы вывести тип. Иначе ругалось бы, что мы не группировали по type, а нам это и не надо. Т.к. тип аппаратуры у итоговых производителей только один, то всё равно min(type) = type.
>>982478 А, ну вот, теперь понял! Спасибо. Меня и путало именно то, что ты поменял, так как я думал, что в дальнейшем используется именно значение минимум/максимум из type, которому и присвоили имя этого столбца, а не оригинальный столбец. Короче, придумал себе, что это что-то вроде переменной и не понимал как из неё выходит решение. А оказалось, что это просто не особо нужная штука, внедрённая лишь чтобы избежать ошибки при выполнении.
Аноны, я застрял со своим затупом: Задача 18 DML с sql-ex: Перенести все концевые пробелы, имеющиеся в названии каждого сражения в таблице Battles, в начало названия.
Вот запрос: update battles set name = ' '+name where right(substring(name, 1, len(name)+1),1) = ' '
Пишет, что 33 несовпадения на базе проверочной. Первый затуп за все время и на такой казалось бы простой задаче. В чем подвох?
>>982780 У тебя есть строка, которая начинается с 3 пробелов и заканчивается 10 пробелами. После преобразования строка должна начинаться с 13 пробелов, пробелы в конце должны исчезнуть.
Каким образом разумнее хранить объекты с различными атрибутами (например, товары с набором их характеристик, которые различны для каждой категории и иногда отличаются в её пределах) в базе так, чтобы поиск по этим атрибутам не был затруднён? Есть ли нормальные альтернативы Entity-Attribute-Value для реляционных БД?
Кто-нибудь может объяснить, почему в качестве кластерного индекса рекомендуется юзать что-то уникальное и инкрементальное, например, айдюха? По идее при вставке б-дерево будет очень часто перебилдываться.
Статья в 2009 опубликована, за эти много-много лет уже все до меня (не)сделали.
Как я понял, не хотят добавлять upper/lower cases т.к. куча специфических нюансов типа письма слева-направо, возможности кодировать один символ разными способами, и т.д. В это все углубляться не стал, так как нужен был исключительно русский язык. Под самый конец (как и полагается) даже нашел статью о примерном решении к которому сам пришел, вобщем все как обычно.
>>973923 (OP) сап двач. сижу в шараге 4 пары практики по БД!!!! Нужна помощь с запросом. нада вычеслить разность количества товаров из двух таблиц: ПОСТУПЛЕНИЕ и ПРОДАЖИ(есть еще таблица ТОВАРЫ но похуй). То есть сгруппировать товары в обеих таблицах по коду товара и sum(Postuplenie.Kolvo)-sum(Prodaji.Kolvo). ВОТ таблицы:
Продажи
Номер________int PK Код товара____int FK Дата__________date Количество____int Цена__________money
Поступления
Номер________int PK Код товара____int FK Дата__________date Количество____int Цена__________money
Вот мои наработки: SELECT sum(hui1)-sum(hui2) FROM( SELECT Номер, Название, Дата , Количество AS hui1, Цена, КоличествоЦена AS Стоимость FROM Товары, Поступления WHERE (Код = [Код товара]) UNION SELECT Номер, Название, Дата , Количество AS hui2, Цена, КоличествоЦена AS Стоимость FROM Товары, Продажи WHERE (Код = [Код товара]) ) GROUP BY Номер
>>984604 SELECT t.Номер, SUM(Количество * Направление) FROM ( SELECT Номер, Название, Дата , Количество, Цена, КоличествоЦена AS Стоимость, 1 as Направление FROM Товары, Поступления WHERE (Код = [Код товара]) UNION SELECT Номер, Название, Дата , Количество, Цена, КоличествоЦена AS Стоимость, -1 as Направление FROM Товары, Продажи WHERE (Код = [Код товара]) ) t GROUP BY Номер
Решил продолжить оттачивать свой sql-скилл через sql-ex. Мне, как лишь иногда макросописцу на VBA, очень трудно дается абсолютно новая сфера. Решил влететь на рейтинг и с первой задачи охуел: Дима и Миша пользуются продуктами от одного и того же производителя. Тип Таниного принтера не такой, как у Вити, но признак "цветной или нет" - совпадает. Размер экрана Диминого ноутбука на 3 дюйма больше Олиного. Мишин ПК в 4 раза дороже Таниного принтера. Номера моделей Витиного принтера и Олиного ноутбука отличаются только третьим символом. У Костиного ПК скорость процессора, как у Мишиного ПК; объем жесткого диска, как у Диминого ноутбука; объем памяти, как у Олиного ноутбука, а цена - как у Витиного принтера. Вывести все возможные номера моделей Костиного ПК.
Ладно, пара часов и всё свел, получил правильное решение на общей базе, но на проверочной встрял. Походу встрял на пункте, где надо вытащить модели с общим 3 символом. Итак, вот мой подход: >Выбираем все модели с количеством символом от 4, где можно применить правило "первые два символа и все после третьего должны совпадать"
with baze as(Select model, left(model, 2)+right(model, len(model)-3) num3 from printer where len(model) > 3 union select model, left(model, 2)+right(model, len(model)-3) num3 from laptop Where len(model) > 3) select model from (select num3, count(num3) ct from baze group by num3) ac left join baze on ac.num3=baze.num3 where ct > 1 >Дальше объединим с "все модели с <4 символов, у которых должны совпадать только первые два". Тоже самое, только чуть иначе: with baze as(Select model, left(model, 2) num3 from printer where len(model) < 4 union select model, left(model, 2) num3 from laptop Where len(model) < 4) select model from (select num3, count(num3) ct from baze group by num3) ac left join baze on ac.num3=baze.num3 where ct > 1
Ну и далее я при определении ноута Димы буду просто ссылаться на полученную таблицу с моделями. Все равно не могу дополучить 2 значений на проверочной базе. Где я дурак?
Реквестирую вводную книгу по SQl. А то знакомый-студент попросил решить пару заданий, а я даже после беглого гуглинга понял, что нихуя не понял этот ваш SQL.
>>985951 Любая книга подойдет, если ты совсем по нулям. Я выучил sql как начал с ним работать. Не скажу что дохуя эксперт, но для решения большинства задач знаний хватает. Пока читаешь про сферический left join в вакууме в памяти откладывается все это плохо. Нужна постояная практика.
>>986027 Полностью двачую, аналогичная хуйня. В универе были курсы по бд и хранилищам, все проебланил, как мудак. Думал, что хуйня, все казалось скучным и неинтересным. А на работе а к а стажировке проникся прям, тепеь жить не могу без двх, кубов скл и мдх. (И соответствующей приятной зп, конечно.)
>>987659 Хотят, чтобы ты табличку с подразделениями заджойнил на себя 4 раза и вытащил в оезультат запроса коды и наименования "родительских" подразделений. Проиграл с термина >историзация Принято говорить историчность прост
для про-левела можно вместо 4 джойнов заебашить рекурсию, но, если ты не понял суть задания, то про рекурсию, скорее всего, не слышал
>>985740 То есть должны попадать только те, что длины 2 и совпадают по этим двум символам, а например ххх и хх не должны считаться как совпадающие? В таком случае опять ошибка: With bazex as (select l.model lapmod, pr.model prmod from (select model from laptop where len(model) >3) as l, (select model from printer where len(model) >3) as pr where substring(l.model,4,len(l.model)-3)=substring(pr.model,4,len(pr.model)-3) and substring(l.model,1,2)=substring(pr.model,1,2) and substring(l.model,3,1)<>substring(pr.model,3,1) union select l.model lapmod, pr.model prmod from (select model from laptop where len(model) =3) as l, (select model from printer where len(model) = 3) as pr where substring(l.model,1,2)=substring(pr.model,1,2) and substring(l.model,3,1)<>substring(pr.model,3,1) Union select l.model lapmod, pr.model prmod from (select model from laptop where len(model) =2) as l, (select model from printer where len(model) = 2) as pr where substring(l.model,1,2)=substring(pr.model,1,2) and substring(l.model,3,1)<>substring(pr.model,3,1) ),
OLap as (Select p.model, l.screen screen,ram from product p left join laptop l on p.model = l.model where p.model in (select lapmod from bazex union select prmod from bazex) and p.type = 'Laptop'), VityaP as( Select p.model, printer.type, color, price from product p left join printer on p.model = printer.model where p.model in (select lapmod from bazex union select prmod from bazex) and p.type = 'printer'), TanyaP as(Select model, type, color, price from printer where type not in (select type from VityaP) and color in (select color from VityaP)), MishPC as( Select p.maker, PC.model, PC.price, speed from PC left join product p on p.model = pc.model Where PC.Price in (Select price*4 from TanyaP)), DimLap as (Select maker, l.model, hd from laptop l left join product p on l.model = p.model where screen in (select screen+3 from OLap) and l.model not in (select model from OLap) and maker in (select maker from MishPC)) Select model from PC
Where speed in (select speed from mishPC) and hd in (select hd from dimlap) and ram in (select ram from OLap) and price in (Select price from VityaP)
Не знаю связанно или не связано с тематикой данного треда, сам нуль поэтому и спрашиваю тут: Есть короче друпал у него есть бд, я через phpmyadmin в друпальскую БД добавил свою колонку допустим с Id и Name как мне их вывести на странице? Скиньте либо тутор какой нибудь, либо наставьте по пацански, можете даже обосать, только не бейте. Алсо если друпал говно предложите альтернативу. По сути мне нужно только выводить информацию с бд на странице. Спасибо.
>>987769 Наоборот: две модели с длиной 2 не подходят под данное условие по определению. То, что ты пытался отсеять, допустимо, если это допустил автор задачи.
>>987805 Ну вот про последний случай я и говорил, что тут не понятно. Отсутствие и наличие символа может считаться различием. Учитывая, что тебе нужно сам третий символ сравнивать. В теории модели принтеров и ПК могут совпадать
>>987815 Ну а зачем сравнивать с 2 символами, если можно ограничиться только двумя выборками - с 3 символами и с более 3х? А для третьего символа я добавил substring(l.model,3,1)<>substring(pr.model,3,1)
>>988689 если книга разгоняет за сыкуль соответствующий какому-то актуальному стандарту то да. SQL вроде консервативен дохуя так что просто не бери книги старше 20 лет лол
Есть 2 таблицы, по ним нужно сделать задания. Делаю, но никак не в дуплю. В заданиях говорится о пользовательских отчетах. Что значит пользовательский отчёт? Потом ещё требуют сделать с параметрами для выбора пользователя.
>>988874 Пользовательский отчет - это результатов запроса куда-угодно: в Excel, Reporting и т.п. Суть в том, чтобы этот отчет имел возможность обновляться и отображать всегда актуальные данные. в Excel это делается через "Данные"-"Подключения", куда ты должен запилить процедуру или вьюху.
>>988904 Ты не просто нуб, ты еще и долбоеб. У тебя на картинке тектса меньше чем на килоайт. Но ты, блядь, запихнул его в картинку на 22 мегабайта. Качать 22 метра так себе удовольствие. Если не можешь описать задачу нормально, то сиди и страдай. Тебе никто ничего не обязан.
>>990892 Если тоже самое значит может работать приведение типов, как между char и byte... ох вэйь оно не рботает, а ты долбоеб просто не понимаешь о чем пишешь. Кокая печалька.
>>990893 >эксель гугл спред щитс >перечислил говно Wait... Нужно, чтобы ты убедил нас в преимуществе своего говна над экселем, тогда, так и быть, включим его в следующий тред.
Есть таблица в Sqlite как на пике. Колонки А и В содержат условные числа, в С - произведение А и В. Некоторые ячейки в колонке С не заполнены должным образом. Как это сделать?
>SELECT `name` FROM `items` ORDER BY `name` >Item - Stage 10 >Item - Stage 11 >Item - Stage 6 >Item - Stage 7 Ору с этой парашной сортировки в 2к17. Пиздец, стыдоба, просто пиздец.
Существует НОРМАЛЬНЫЙ способ (т.е. максимум в одну строку) правильно отсортировать имена? Чтобы стало вот так: >Item - Stage 6 >Item - Stage 7 >Item - Stage 10 >Item - Stage 11
>>995354 Опиши критерий, по которому ты хочешь сортировать? В твоей табличке в поле name есть только записи в стиле >Item - Stage X ? На каком месте, напрмер, должна находиться запись >Item - Stage 1x1? В общем, напиши нормально постановку задачи. Mysql сортирует твоим имеа, как строки, в которых 11, очевидно, идет перед 2.
>>995398 Мне нужна натуральная сортировка (Natural Sort https://en.wikipedia.org/wiki/Natural_sort_order), где результат будет такой: ... >ItemOne - Stage 6 >ItemOne - Stage 7 >ItemOne - Stage 10 >ItemOne - Stage 11 >ItemTwo - Stage 6 >ItemTwo - Stage 7 >ItemTwo - Stage 10 >ItemTwo - Stage 11 ... В пхп есть функция natsort http://php.net/manual/en/function.natsort.php однако я спрашиваю про такую же функцию в mysql. Других колонок для сортировки в таблице нет, есть только рандомные айдишники.
>A solution could be to create another column Для того, чтобы создать колонку с сортировочным ключом нужно изначально отсортировать правильно и/или написать сортировочную функцию. Перечитай мой первый пост, там сказано "НОРМАЛЬНЫЙ способ (т.е. максимум в одну строку)".
>SELECT alphanumeric, integer FROM sorting_test ORDER BY LENGTH(alphanumeric), alphanumeric Обосрётся как только изменится размер строки с "ItemTwo - Stage 11" на "ItemThree - Stage 11".
>SELECT names FROM your_table ORDER BY games + 0 ASC Работает только на числовых строках.
>несколько ответов, где предлагают создать функцию на сотню строчек Тут всё ясно.
>CAST(mid(name, 6, LENGTH(c) -5) Не сработает на строках разной длины и структуры.
>REPLACE(`table`.`column`,'Scene ','') Не сработает на строках разной длины и структуры.
>Utilise the "Release Date" column У меня нет подобных колонок.
>ответы, которые повторяются и уже давали выше
А теперь я попрошу опять. Мне нужен короткий способ натуральной сортировки МОИХ строк. Кто-нибудь может помочь?
>>995408 Так и не добился от тебя ответа на вопрос, что за данные лежат в поле name. Если они все только заканчиваются каким-то числом, идущим после пробела, то отсортируй по нему:
>Order by right(name, instr(reverse(name), ' ')-1), name
>>995437 >Мне нужен короткий способ натуральной сортировки МОИХ строк. Кто-нибудь может помочь? Я не знаю, как нужно отсортировать твои строки. Могу показать, как нужно получить на скрине на настоящией колонке с данными.
>>995440 >natural sort >This function implements a sort algorithm that orders alphanumeric strings in the way a human being would while maintaining key/value associations >human being >я не знаю, как отсортировать твои строки
О чем разговор тогда? Числа могут встречаться только в конце твоих слов или где угодно?
>>995443 По твоим строкам не очевидно, как их нужно сортировать. В моем же случае полностью очевидно - по названиям и по стейджу. Или ты хочешь сказать, что человек при сортировке моих данных поставил бы стейдж 12 выше стейджа 7 имея "Baleful Staff - Stage 12" и "Baleful Staff - Stage 7"? Нет, поставил бы правильно, т.е. как >human being
Если только в конце, то сортируем по 1. Имени, обрубленному до первому встречному числу, если оно есть, 2. По числу, если оно есть. Order by Case when right(name, instr(reverse(name), ' ')-1)+1=right(name, instr(reverse(name), ' ')-1) Then Left(name, len(name)-instr(reverse(name), ' ')-1) Else name End, Case when right(name, instr(reverse(name), ' ')-1)+1=right(name, instr(reverse(name), ' ')-1) Then Cast(right(name, instr(reverse(name), ' ')-1) as int) Else 0 End
К сожалению, в mysql нет нормальной проверки на то, является ли строка числом, поэтому приходится так извращаться. В одну строчку не сделаешь, думаю.
Помогайте Есть таблица, в ней поля Id, дата открытия договора , дата закрытия Все за 2015 год Договор открыт - считается активным.
Надо вывести все активные договора в мае месяце! Договор может быть открыт 1 мая и закрыт второго. Такие тоже выводить.
Второе задание.
Есть те же данные, получить разбивку по месяцам и кол-во активных дней. К примеру. 1,01.01.2015,15.05.2015 Должный получить 3 поля Айди, месяц, кол во активных дней. Из даты выше выйдет такое: 1,январь,30 1,февраль,28 1,март, 30 1,апрель,31 1,май,15. 15 - так как договор был закрыт 15 мая, то есть активен 15 дней
Посоветуйте БД, где сама база данных размещается в одном файле, аналог Sqlite и Access. Первая не подходит потому, что только под дотнет шифруется, а вторая потому что проприетарщина. Я смотрел на H2, но так и не нагуглил, можно ли всю БД иметь в подключаемом к моей программе файле.
Айди договора, дата открытия, дата закрытия. Договор 1,01.01.2015,05.05.2015 Посчитать кол-во активных дней,т.е. Построить отчёт следующего вида: Договор 1,январь,30дней Договор 1,февраль 28 дней .. Договор 1, май,5 дней
>>997857 Количество активных дней считается через разницу между датой начала договора и сегодняшним днем или датой закрытия? Какая у тебя СУБД? В разных субд даты вычитаются разными функциями.
Функцией dateiff мы получим 70 с хуем. дней, то есть январь февраль и 15 дней марта Мне же надо посчитать в каждом месяце сколько дней "активных". Я скинул пик даже, что непонятного?
>>997965 А это вообще законно? Обычно явно пишут какие таблицы есть и какие можно использовать. А тут не особо ясно что ты к чему джоинить собрался. Годы? Месяцы? Дни?
>>998012 Вот есть у тебя дата открытия 1 января 2015 и дата закрытия 1 января 2017. Если джоинить по таблице с месяцами, то джин даст ровно одну строку. И в чем смысл?
Допустим есть таблица с большим количеством записей. Что эффективней: - делать запрос в такую таблицу - или разбить таблицу на несколько (таблица1, таблица2...) и делать запросы в них, а результат объединять ?
>>978107 постгрес это хайп, хомяки все на него побежали. вопреки кукареканию EDB и Бартунова до оракла и MSSQL ему пока еще слишком далеко, т.е. совсем, лет так 10-15 не меньше (представь куда уйдет оракл за это время), а многих вещей у него вообще никогда не будет. в сравнении с MySQL он до сих пор проигрывает по репликации, по сложности обслуживания (это кажется мол чего там, а потом всех заебывает), по скорости. у постгреса 55 сторонних левых решений по репликации, встроенное начало шевеличться только сейчас, на фоне MySQL это позор. ну когда там появится нормальный отлаженный отшлифованный мульти-мастер? что до модных хипстерских фишечек постгреса: даже консервативные mssql и оракл не отстают, в оракле уже есть Json. mysql тоже не отстает и там тоже есть json теперь, по поддержке SQL mysql уже подтянулся и реализовал и оконные функции, рекурсию в цте и вроде даже кубы. mysql вообще очень сильно вырос за последние 10 лет, я его вообще как качественно иной продукт воспринимаю. всякие прикольные экстеншены и хуйнюшки постгреса в массовой практике никто не использует, не воспринимает и не даст тебе этого сделать, тебя просто коллеги-программисты не поймут. полнотекст у него хороший но он хуже и всяких люсен и даже вшивого сфинкса. выбирает-то он быстро но выборка без ранка пользы не несет никакой, они сами это понимают и пишут и говорят, приставные костыли в виде рум начали появляться только сейчас, это при том, что люсенам и сфинксам уже хз сколько лет и там всё давно отлажено. проблемы постгреса с валлогами и переполнением транзакций - они вообще не будут никогда решены, это просто его особенность. ну а что у него есть особо? дмл транзакционный? это мелочь на самом деле незначительная. постгис - но это отдельный проект, и к БД отношения не имеет, ДБА на этом ЗП не увеличит, программист тоже, это нишевая вещь очень (постгис), это надо идти тогда в ГИС куда-то но там надо много чего другого. т.е. постгес это такая красивая идеальная картинка, всё прикольно, модно, правильно, но на практике всё разбивается о реальность: всё это свистелки мелочные, а постгресу реально нет места особенно-то.
>>998378 все ответы неправильные. таблицу с "большим кол-вом" данных нужно оставить как есть. базы данных на то и придуманы. если запрос тормозит, значит проблема в чем-то другом (может быть в запросе?)
Итак, слушайте задачку не особо сложную на тему хранилищ данных: у вас есть таблица-источник в виде матрицы: В первой колонке города, откуда едет транспорт Каждая следующая колонка носит название города, куда поедет транспорт. А на пересечении стоит значение: >26дн.30000 где 26дн. - это время, затрачиваемое на поездку, а 30000 - стоимость перевозки. Например, >Города_____|Москва______|Спб >Псков______|15дн. 150000 | 26дн. 210000
Придумайте архитектуру для расположения этих данных в вашем хранилище. %%Инб4: Хули такой формат? данные в источнике изменению не подлежат
>>999306 Двачаю, смотреть на миллиард строк - нечто странное, когда человек хочет посмотреть то, сам не знает, что.
Когда доходит до миллиарда строк, пора задуматься об OLAP, если честно, или писать самому агрегации и смотреть уже их. А, если вдруг появляется конкретный вопрос, >%_Юзернейм_%, почему у меня тут такое число в отчете?? Тогда смотреть детализацию на конкретных срезах, априори, не весь миллиард строк.
Но индексы, конечно, не помешают, хотя бы кластерный, чтоб структура хранения была упорядоченной.
Пизлец блядь, хожу по вакансиям в дс, где уровень джуна нужен, 25-30к прошу. Собеседование проходят ничего, вроде даже руководителей приглашают, и не берут блядь. Как так то. Конкуренция или что? Вакансий 30 обошёл ща 3 месяца. Было пару мест где я обосрался, не ответив не слова.
Причём писали: извините мы нашли другого и пал выбор в его пользу. Мониторю эти ваканссии, а они каждый день обновляются. Ну что за пидоры.
>>999538 >25-30к прошу это в каком городе ты такие днище копейки просишь? поражаюсь с дебилов. небось еще на оракл работать пошел, это ж заебись - писать запросы в БД стоимостью в миллионы и просить три копейки за свою работу...
Только изучаю эти ваши ЭСКВАЭЛИ. Есть пик. Нужно для каждого издательства извлечь книгу, которая была напечатана в наибольшим тиражом реди всех книг этого издательства. Издательство должно быть из Москвы. Если тираж в издательстве для данного жанра(т.е. жанр книги с максимальным тиражом) не превышает 100000 книг, то мы такой результат отсекаем.
Нужно составить соотвествующий SQL запрос. Вообще я с потсгресом работаю, но впринципе похрен. Спасибо.
>>999650 Вот все и думают, что ты неуверенный в себе омежка. Хорошенько вызубри все вопросы, которые могут задать, проси сразу 50к, рычи, двигай тазом.
Есть один toad Data modeller, который я законно скачал с триал-лицензией, но вот теперь у меня проблема, триал кончился. Короче, нас только в нем учили базы рисовать, а кряк или ключ не могу найти, посоветуйте чего.
>>999721 Если не можешь найти кряк, то ищи триал ресет. Попробуй переустановить на виртуальной машине. Если сильно нужно, качай IDA Pro и дисассемблируй исполняемый файл.Используя реверсинжиниринг можешь написать кишен сам.
>>999650 >А сколько просить? Все равно не берут, прошу по минимуму, 25-30. Вот скажи, если ты будешь просить 15 000 тебя, ты думаешь, возьмут? Проси сразу 5 000 тогда - за день работу найдешь, а за 2 500 вообще сами прибегут, согласно твоей "стратегии".
>>999650 если бы ты был им нужен, взяли бы на 65к безо всяких вопросов (в ДС-то). но раз ты не нужен им, то не возьмут, даже если будешь сам и доплачивать, вот поверь. деньги тут ни при чем. поднимай уровень
>>999751 adventure - это название схемы, в которой лежит таблица product. Общее расположение таблиц такое: "База данных"."схема"."таблица" В ms sql дефолтная схема - dbo В postgesql - public В mysql схем, кажется, нет. В таком случае, adventure будет уже названием бд, это неточно, мало работал с mysql Схемы - это как папки, в которых у тебя лежат таблички.
>>999753 Как поднять то уровень? Уровень тех же запросов поднимается когда они по 30 раз в день пишутся запросы не похожие на те, который ты писал в прошлый день, сложнее. На работе есть такая возможность. А дома что? Поставил криво Sql, порешил задачки на Sql ex. И усе.
Хочется реального опыта, сейчас рассматриваю аналитика, тех же продаж с написание запроса.
Такое ощущение, что вместе со мной, на собеседование следом приходит гуру Sql -ик готовый пахать за 30
>>999766 Как только ты осилишь оконные а к а "аналитические" функции, базарю, тебя будут брать. На всех собеседованиях почти, на которых я был (на аналитика) только это и спрашивают. ясное дело, джойны там хуейны, но это само собой разумеется
Оно? Может проблема в том , что я свои знания подтягиваю без участия "книг"? Щас начал читать sql для смертных - новое издание за дня 4 осилю надеюсь. А то на собеседованиях спрашивают, мол как изучаешь. А я говорю: статьи, гайды, задачки решаю. А тут ещё добавлю, что книги читаю, блчдь!
>>999811 Оно. Я бы еще, все-таки, поставил себе дома субд и поигрался с открытыми данными, написал простое приложение, вытягивающее данные из БД, сделал пару отчетов на ssrs, jasper-е или powerBI, все это бесплатно, кстати говоря. И на msdn, например, куча инфы о том, как и что работает. А, если вдруг не понятно что-то, всегда есть stack overflow.
>>999827 За 3 месяца без работы, можно и с голоду подохнуть и гола то идут. А так да, MySQL стоит. Вкатиться бы в etl нубом или аналитиком тех же продаж. И дома попутно углубиться. Был к слову на той неделе в одной крупной конторе на нуба скл. Собеседование прошло ничего с рук проекта.даже эйчара не было. Но к сожалению "хорошо" я думал до сегодняшнего дня, так как мне отказали
>>999811 хуею с вас. натурально. сейчас столько возможностей: 1. железо нормальное недорого, 2. если надо сервер не свой, то есть виртуализация, можно арендовать сколько надо, хоть по 10 минут плати 3. юниксов доведенныз до ума полно (это же пиздец): макинтош; фрибсд, линупс (бесплатная операционка, причем охуенная!) 4. появились бесплатные полноценные версии крутейших оракла, микрософт-скл, дб2 даже вроде есть 5. бесплатные опенсорсные реляционки: майскл, файрберд, склайт, постгрес 6. инструменты опенсорсные любые вообще, мощные 7. данные в интернете ПОЛНО. ПРОСТО ПОЛНО 8. каналы толстые, скорость скачивания бешенные 9. диски громадные и дешевые (террабайт уже вроде меньше 100 долларов сейчас) 10. литературы ворованной хоть жопой жуй, я в свое время даже обложек блеать не видел 11. литературы вендорской куча и хорошо сверстана в вся на сайтах 12. ИНТЕРНЕТ КОПЕЙКИ СТОИТ. просто КОПЕЙКИ по сравнению с тем что было В Ы Е Б А Н У Т Ы Е В Ы Д Е Г Е Н Е Р А Т Ы
Так никто и не отрицает, поэтому и просят советов мудрых, что ты, как первый день на дваче. Мне, например, не в падлу рассказать, что знаю, и поделиться собственным опытом, в отличии от уебков >гыгы, 150 к, попал с первого собеседования, не знаю, что вы не можете.
>>1000015 Это функции, применяемые с выражением OVER () И классические задачи с ними, например, в tbl_sale (sale_id, manager_id, sale-date, product_id)
>на каждый день вывести количество проданных продуктов с 2017-01-01
>выбрать тех менеджеров, у которых было максимальное количество продаж на в предыдущем месяце
у меня друг работал в обосранном нии сраным инженером, сосал хуй, затем его заебала зарплата в 15 т.р., было это лет 5 назад, взял месяц отпуска, выучил pl/sql, сразу взяли в ренесанс страхование за 30 т.р.
>>1000828 > для маленького-среднего проекта SQLite или MySQL > что можно почитать про производительность и оптимизацию БД? Гугол. Укажи ему конкретную БД, т.к. оптимизации в разных БД так же могут быть разными.
>>1001125 >PostgreSQL Pro Standard - репак от Васянов Походу Pro это форк? Непонятно зачем Pro версию вообще пилят. Основной разработчик Pro версии Олег Бартунов является основным котрибутором в PostgreSQL.
Что в этой строке означает "f?" ? Нагуглить немного проблематично такое. Алсо пример из книги. Дейт введение в ДБ, там без привязки к конкретной реализации СУБД, вроде как чистый SQL, я делаю задания и практикуюсь на postgresql
>>1001502 В рот ебал переводы. Чекнул оригинал - нету там никакого "f?" Всего одну главу прочел, уже второй косяк нахожу, первый правда был смысловой, который меня в ступор вогнал и заставил найти оригинал, а в оригинале все логично и просто было. Сук. Но с другой стороны оригинал только в качестве пикретейлед 8 издание нашел, да и вообще, 1 000 страниц на родном языке как то значительно проще было бы осилить ,чем на инглише.
Работаю уже больше года аналитиком в банке. Пишу всякие хранимки на t-sql и pl/sql. Смотрю сейчас вакансии Разработчик/администратор ms sql. Вот думаю надо как-то выучиться, но не знаю в какую сторону копать, где нужный материал искать. Есть тут разрабы бд, которые могут подсказать?
Аноны, помогите, есть таблица PETUH В ней есть поля DATA_ROZHDENIYA, и поле SROK_ZHIZNI, дата рождения записана в форме даты, а срок жизни просто цифра, как сделать так, чтобы к дате рождения срок жизни добавился в виде годов? Мне надо вывести всё что data_rozhdeniya + srok_zhizhni < Сегодняшнее число! Помохите!
>>1002133 Почему бы не объединить солиста, дирижера, композитора в таблицу people с атрибутом type, а оркестр и оркестровую группу во вторую - play_groups, тоже с атрибутом type?
Меньше сущностей, как-то по-проще, всё-таки. Да и связей меньше будет.
>>1002133 Что ты накорябал не отражает типов отношений сущностей. Что за связи? 1 к 1? 1 к многим? Многие к многим? Я бы зачета не поставил за такую халтуру.
>>1001695 Бля. Как раз рвусь в банк. Как туда попал? Какие навыки были? Какой город и зп если не секрет.
Ходил на собеседование в три банка (я только запросы лёгкие решаю 1-2 лвл на скл екс если со и об этом эйчары были предупреждены) там такие задания дали, что я смотрю - и не понимаю нихуя. Хотя в двух местах все таки дома сделал тестовое, го везде отказали. К слову зп - 90 там где нихуя не сделал. 50 и 40 в других местах.
А , ещё в четвёртом месте был, инет магазин, руководительница баба. Сидел с ней полтора часа решала со мной вложенный запрос , а я не догнал. И отказали потом. До сех пор ваканссию апают, видимо 30k - мало и ни кто не идёт к ним
>>1002425 Ой все. Я блять только 1 главу прочел. И занимаюсь самостоятельно. Иначе очевидно у препода спросил бы, а не на дваче. >>1002416 Короче, хер с заданием продолжу дальше изучать, ибо о том что такое атрибут таблицы еще не читал. Просто стараюсь максимально вникать в то что читаю и выполнять все задания, но выпоняю их естественно на своем уровне знаний, и конкретно - 1 глава Введения в ДБ Дейта.
Мне либо повезло, либо ещё что, но сложностей вкатиться не было. Задания были несложные, диплом не спрашивали. Банк иностранный. При этом другой банк даже отклик не просмотрел, а сразу отказал.
Есть один mssql сервер и одна хранимка. В хранимке запускаются еще 3 хранимки. Каждая из них запускает приложение через xp_cmdshell. Все программы делают что надо и завершаются. Но в процессеработы выводят в консоль всякие важные замечания по своей работе. Нужно как то совладать с этим выводом. Каждая программа выводит все данные как результат отдельного запроса. Нужно как то сделать что бы они все писали в одну таблицу и потом уже ее выводила главная хранимка перед завершением. Как так сделать?
>>1003095 Ах да, самый очевидный вариант с созданием таблицы в бд меня не утсраивает. Хранимка может одновременно запускаться разными людьми. Так что нужно что бы все данные обрабатывались исключительно внутри нее.
Котаны, есть один интернет-магазин на связке PHP+MYSQL, в котором есть одна таблица с товарами (около 40к позиций) и таблица с категориями. Нужно туда добавить характеристики товаров с возможностью фильтрации по ним. Проблема в том что магазин большой, категорий и товаров дохуя, следовательно и характеристик тоже. Первое что мне пришло в голову - добавить две таблицы, одну со списком всех характеристик, вторую со связью характеристик и товаров:
PROPERTIES_LIST: ID, NAME, FILTER_NAME (опционально, если в фильтре нужно какое-то кастомное название характеристики), SORT (опционально, для сортировки вывода характеристик если понадобится определенный порядок), TYPE[bool,range,value] (тип характеристики для фильтра. Да\нет, подбор по диапазону, подбор по конкретному значению)
PROPERTIES_VALUES: ID, ITEM_ID, PROPERTY_ID, VALUE
Самое простое - просмотр одного товара. Ищем по PROPERTIES_VALUES записи с нужным ITEM_ID и выводим названия и значения характеристик согласно SORT в PROPERTIES_LIST
Далее, нам нужно для каждой категории вывести все имеющиеся в ней характеристики товаров. Т.е. когда мы заходим в какую-то категорию нам нужно пробежаться по всем товарам данной категории и собрать с них все id характеристик, удалив дубли. Потом на основе этих ID построить фильтр, учитывая тип характеристики и заполнить значения (минимальные и максимальные для диапазонов и конкретные для конкретных).
Если первое я еще примерно понимаю как сделать, то со вторым вообще хз. Подскажите куда смотреть, и вообще может я изначально хуевое решение придумал и нужно совсем по другому все сделать?
>>1003117 Пробывал временную таблицу, но как то нихера не выходит. Вложенные хранимки почему то ее не видят. Если кто напишет рабочий пример буду признателен.
>>1003337 Глобальная временная таблица, сздается через ## Create procedure sp_test_start As Begin If object_id('tempdb..##tbl_temp_logs') is not null drop table ##tbl_temp_logs Create table ##tbl_temp_logs (id int) Exec sp_test_logs_1 Exec sp_test_logs_2 Select id from ##tbl_temp_logs End
Create procedure sp_test_logs_1 As Begin If object_id('tempdb..##tbl_temp_logs') is not null Insert into ##tbl_temp_logs (id) values (1); End
Create procedure sp_test_logs_2 As Begin If object_id('tempdb..##tbl_temp_logs') is not null Insert into ##tbl_temp_logs (id) values (2); End
>>973923 (OP) В БД есть таблица с регистрацией клиентов вида CustomerId, RegistrationDateTime и таблица с покупками клиентов вида CustomerId, PurchaseDatetime, ProductName. Напишите два SQL-запроса: - Запрос выводящий клиентов, которые покупали молоко, но никогда не покупали сметану. - Запрос выводящий количество клиентов, которые совершили первую покупку через 0-5 дней после регистрации
>>1003435 INSERT INTO sex(tool, place, whoreId) SELECT 'anus' AS place, me.cock AS tool, whores.id AS whoreId FROM me, whores JOIN parents ON parents.child = op.id AND parents.motherId = whores.id
>>973923 (OP) Есть два отношения: -частные клиенты{код_клиента} -компании{код_компании} Также существуют еще два отношения: -товар -продажи {код продажи, количество, код скидки} - связанна "многие к одному" с товаром Еще существует много других отношений (скидка, журнал продаж и т. д.), но они тут не важны. Если мы соединим "продажи" с "частные клиенты" и "компании" одновременно, то смигрируют два ключа - "код_клиента" и "код-компании" и получится аномалия вставки. Я продумал только два варианта решения проблемы: 1) Ввести фиктивные кортежи в отношения "частные клиенты" и "компании" и присваивать этот фиктивный домен атрибуту "код_клиента" когда мы описываем продажу для компании и, соответсвенно, наоборот.(в данном случае отношение не находится во второй нормальной форме) 2) Создать два отношения "Продажи_Клиентам" и "Продажи_компаниям". Но тогда атрибуты будут одни и одни и те же, только будут зависить от разных детерминантов. Какие еще существуют решения данной проблемы?
>>1004737 Две таблицы ДВА ОТНОШЕНИЯ ЛОЛ - нормальный вариант, навешиваешь над ним вьюху и не ебешь себе мозга.
Еще можно просто запихнуть все в одну таблицу, добавив атрибут sale_src_id какой-нибудь, по которому однозначно можно определить, кому продали товар: 1: частному клиенту 2: компании
Итого у тебя получатся >cleint_id|sale_src_id в таблице с продажами, на которые ты смело можешь ебашить индекс.
>>973923 (OP) Посоны, есть одна таблица, в которой ID, имя и ID родителя (nullable). Как по имени вывести всех родителей и родителей родителей данного имени? куда копать то, джойны, рекурсивный запрос?
>>1008290 Уже хуй знает, но что я делаю не так? По идее для каждого должна выводиться вся иерархия, то есть для Иванова она будет выглядеть Иванов Петр Сергеевич Отдел логистики Отдел Иванов Петр Сергеевич Служба логистики Служба Иванов Петр Сергеевич Административная дирекция Департамент Но проходит только один раз анкор и один раз рекурсивная часть
Как в этих ваших mssql сделать enum? Типа есть поле в таблице "статус", которое может принимать N значений. Поскольку в T-SQL не завезли enum, я вижу три варианта, но не знаю какой из них оптимален: 1. добавить constraint check (status = 'firstValue' or status = 'secondValue' or ... or status = 'lastValue')\ 2. добавить статическую справочную таблицу, для которой в целевой таблице будет внешний ключ, и потом уже при запросе в скомпилированном view будет подставляться текст значения вместо его FK 3. в БД хранить поле в виде int, а в клиентском приложении биективно отображать в задуманное значение.
ИМХО 3 самый легкий и быстрый, а также позволяет хранить флаговое перечисление например, если статус имеет значение одновременно FirstValue, SecondValue и NthValue но заебистый в плане изменения значений. Второй вариант вроде ничего, но постоянные обращения к справочным таблицам это чё то фу. Первый вариант вообще не рассматриваю, но знаю о его существовании. Таки шо порекомендуете?
>>1008354 Храни интом или стрингой. С интом можно наебаться, если enum изменится. Со строкой такого не будет, но места она займет больше (возможно, не такая уж и болая проблема).
Я наконец то сделал это! После очередного собеседования с руководителем, меня все таки взяли на джуна etl процессов, дс, крупный банк. 60к зп после вычета налога. Спросил меня виды джойнов, ответил и говорит: сегодня офер вышлем и выслали.
Дальше бы спросил бы он - я бы не ответил. Я даже задачи с рождаемости решить не могу и не знаю об индексах ключах оптимизации и тд. Всему должны научить.
Третий способ классный, но только если у тебя есть хорошая актуальная документация. Вот я сейчас, например, изучал кучу таблиц, в которых используется так называемый енам, реализованный третьим способом. Спрашиваю у разрабов, что это такое, все плечами пожимают, тип кто-то делал, но уже уволился, нужно импирическим путем познавать через приложение. Первый способ тоже часто вижу в использовании, как в оп-топике: пол кладется в nvarchar(2000), а потом вопросики, а хули так медленно работает?
В общем, тут, правда, ситуативно нужно применять. Хотя я, как любительно всего нормализованного, выступаю за второй, все равно, вынужден согласиться, что первый и, тем более, третий, будут гораздо быстрее работать.
И вот нахуя я вкатился в базы данных. Я же нихуя не умею. Пиздец кризис. Есть работа за сто тысяч рублей. Но я просто клепаю отчетики и ничего больше не делаю. Не etl, не архитектура, просто ссаные отчетики. Мне неинтересно.
>>1008659 Подумал короче, я всё равно с C# работаю, а там через EF можно code-first подход для генерации БД использовать, и там enum просто интом хранится будет без дополнительных таблиц. Короче, 3 вариант.
>>1009218 Просто отчетики - это ж аналитик тип да, по отчетности? Ну ты развиваешься не только в бд, но и в бизнесе же, потому что узнаешь, что все эти данные значат. Можно потихоньку пытаться вставать на путь управления, если не нравятся сами бд.
>>1010088 Причём путь к таким деньгам я осознал только в 26, щас 27. До этого менеджером работал по продажам, знал бы я раньше и был бы умнее, в 22 сразу же этим занялся. На мой взгляд это интересно и перспективно. (Если развиваться дальше)
Это Москва, это банки. Опыт от меня хотели в гавно конторах, и предлагали по 40-60к, вставал уходил Было две параллели. Ходил в гавно конторы и банки хуянки. В первом варианте хотят кучу знаний и не готовы платить. В банках уровень теорий хотят и готовы платить и растить. Вот и прокачало в банк. Причём, человек работающий до меня, свалил с 120 на 150+ в банк на Павелецкой. (По -моему в открытие) С нуля пришёл и через полтора года на 150, неплохо. Понятно почему руководитель теперь на него злой, кучу сил в него вложил.
>>1010120 MySQL только. И до сех пор не понимаю разницы между my и оракл, так как не имел дело со вторым. Запросы везде одинаковые))
Вышку для галочки, по вышке я экономист, нихуя не знающий. И по внешне не разу не программист, эйчары удивлялись, мол, программисты другие))) я довольно общительный
Обычно собеседование с эйчаром, а потом с рук, там уже гоняли по теории. В основном : виды запросов, индексы, оптимизация
На одном собеседование попросили написать триггер на листочке, 40к они предлагали. На что ответил я руководителю в лицо: триггеры для вас будет писать человек, которому вы и платить будите как профессионалу. Он прихуел и начал кукарекать что 40к высокая зп
>>1010127 Ну в общем-то позиция правильная. Тригеры обычно нужно писать раз в полгода-год. Если у кого-то вся логика на тригерах висит, то лучше там не работать.
>>1010131 Я не понял твоего поста Что тебе понятно то? По банкам походи и поймёшь какие цифры они дают тебе. Загляни в тот же сбертех, где каждый второй Джун имеет под сотню
>>973923 (OP) БЛЯТЬ АНТОН у меня горит вот что ей нужно ?? что не так ? как локальный сервер создать? И да, нужно мне это для приконектенья этой бд к асп нету(пик2)
>>1010601 я немного обосрался со средой эта утилита конектит только ms sql НО тут тоже лажа, я хз как локальный скул сервер запустить в списке их нет(пик1)
Мускулач, я решил для саморазвития написать борду. Теория баз данных рекомеедует создать сущность "пост", сущность "картинка", сущность "тред" и сущность "анон" для поддержки свободного™ общения. Соответственно, сделать связь один-ко-многим между тредом и постами. Проблема, как всегда, в запросах: во первых, нужно реализовать систему бампов со вложенными запросами - нужно получить у каждого треда дату последнего отправленного сообщения, не учитывая сообщения сверх бамплимита; во вторых, необходимо получить id только что отправленного поста, чтобы сделать запись в таблицу картинок и в таблицу связи пост-тред. Как эти запросы написать? По диагонали читал сурсы кусабы и других бордовых движков на гитхабе, и не нашел этих моментов, там просто и без задней мысли вставляется.
>>1012209 >необходимо получить id только что отправленного поста, чтобы сделать запись в таблицу картинок и в таблицу связи пост-тред Транзакции нужны, дело говорю.
>>1012217 Кстати, сабж только частично решает проблему - без подтверждения транзакции last_inserted_id выведет предпоследний id, а это не очень хорошо, ведь свободное™ общение предполагает удаление тредов и постов
Здравствуйте, можно ли упростить этот запрос? https://pastebin.com/h7xtcaJ2 Есть связь M:M между книгами и жанрами, хочу вывести список жанров, количество книг в нём, и к каждому жанру добавить последнюю добавленную книгу из этого жанра. (СУБД - MySQL или PostgreSQL). Пытался залить код на sqlfiddle вместе с дампом, но сайт отдаёт Gateway Time-out.
Что читать по теории бд? Опыт потихонечку капает, скилл поднимается тоже, зарплата растет. Но теперь я хочу стать большим специалистом по базам данных, чтобы все досконально понимать. Томас Кайт или что-нибудь ещё? Работаю с бд оракл.
>>1012594 Да, MySQL не поддерживает часть операторов из твоего запроса, но всё равно спасибо за код. Я понял, что простым такой запрос в любом случае быть не может. Тут ведь уместно применить денормализацию - создать отдельную таблицу для самых новых книг каждого жанра? Тогда запрос превратится в простой джойн.
Антоши, вот накачал я MS Management Studio, SQL Server 2012. Поставил себе на комп базу данных. Теперь хочу создать свою бд, с таблицами и хранимками. Как мне можно быстро заполнить свои таблицы хоть чем нибудь? Есть ведь в интернете уже готовые заполненные таблицы с данными, чтоб я мог скачать и внедрить их в свою бд. Ну, там переводчики всякие, справочники.?
Привет, анон, помоги придумать оптимальное решение: Есть таблицы А и В. Нужно выбрать все такие A.pk_id, для которых существует хотя бы один ряд A.pk_id = B.fk_id, но при этом для всех таких рядов B должно выполняться условие B.x is not null Пока на ум приходит только использование exists и not exists select A.pk_id from A where exists(select 1 from B where B.fk_id = A.pk_id) and not exists(select 1 from B where B.fk_id = A.pk_id and B.x is null)
Не нравится, что два раза приходится сканить B, хоть колонки и индексированы. Как можно сделать проще?
>>1014106 Не совсем уловил твою мысль. Нужно убедиться, что в таблице B для всех B.fk_id = A.pk_id выполняется B.x is not null. Допустим получили следующее: select A.pk_id, B.x from A left join B on A.pk_id = B.pk_id Теперь надо как-то схлопнуть результат, чтобы остались только те уникальные A.pk_id, у которых B.x не null?
>>1014167 Триггеры полезны, но нужно использовать очень аккуратно. Они скрывают часть логики. Никогда не знаешь, когда какой триггер "триггернётся". Попаболь может быть дикой от таких моментов. Ну и они включаются на каждый чих, а не тогда, когда тебе надо и не тогда, когда тебе кажется они должны включаться/не включаться. Замедляют базу. >>1014161 Да, неправильно понял твоё задание. Можно через join решить, ну ты сам смотри. Насчёт того, что там у тебя 2 скана, я подозреваю, что планировщик всё равно чётко сделает. Посмотри план выполнения.
select A.pk_id from A inner join B on A.pk_id = B.fk_id group by A.pk_id having count(*) - count(B.x) = 0
Нужно написать запрос, который вернет результат Статус | Кол-во записей c этим статусом 1.05 | Кол-во записей с этим статусом 2.05 | ~ 3.05
То есть результат должен быть 'ok' | 1 | 1 | 2 'cancel' | 1 | 0 | 1
Пробовал группировать по статусу where date = N, потом джойнить полученные таблицы, получилась хуитта. А главное, если кол-во дат неизвестно заранее, как сделать стоблик для каждой? (И шапку еще юнионом присобачить штоле)
p.s. Нет ли сборника таких задач, потренироваться?
>>1014083 Привет, не самый частый гость здесь! Стаж почти два года, работаю в топ-10 банке (без подробностей, деанон), зп чуть больше сотки чистыми. Ты dba? А расскажи пожалуйста про свою работу побольше, мне это очень интересно. Сам я чистый dbd, к администрированию никакого отношения не имею, но подозреваю, что рано или поздно моя любовь к базам данных и желание углубиться в тему приведут к тому, что я стану администратором бд или архитектором.
>>973923 (OP) >Поясняем, как можно без задней мысли хранить бизнес-логику в бд, а не в приложении, Вот это пиздец. Поясните, как это говно исполняется?
>>1014889 Хранимки же. Либа на настольной приложухе запускает хранимую процедуру/селект/функцию. Результат выполнения хранимки - это изменения в базе + набор селектов. Уже селекты приложение обрабатывает, отображает, если надо.
Мне бы лучше кто рассказал, как белые люди логику реализуют. Ибо живу в вышеописанном мирке, света не вижу.
>>1014907 Не могу сказать, потому что я не видел альтернатив. Использовать ORM какую-нибудь? Ну со стороны приложения логика на базе не выглядит сложно, самый ад начинается в самих хранимках. SQL особо не позволяет развернуться. Но со временем привыкаешь к этим бесконечным селектам, джоинам, необъяснимым условным ветвлениям и прочему дерьму.
пацаны, всю жизнь мучает меня такая задача. буду благодарен тому, кто подскажет, прям по гроб жизни. как в группировке вывести значение столбца не участвующего ни в агрегатной функции, не в группировке, но соответствующее записи, в которой значение агрегатной функции равно значению её столбца http://rextester.com/NOVC13144
>>1015164 Зачем, вообще, хранить суммы? Create trigger tr_lul on tbl_one after insert, update As Merge tbl_2 as t Using (select lul_id, a+b as c) as s On s.lul_id=t.lul_id When matched then update Set t.c=s.c When not matched then insert (c) Values (s.c)
>>1015279 Create trigger tr_lul on tbl_one after insert, update As Merge tbl_2 as t Using (select lul_id, a+b as c from inserted) as s On lul_id=s.lul_id When matched then update Set t.c=s.c When not matched then insert (c) Values (s.c)
Есть три типа сотрудников: employee, manager и sales. Информация о них хранится в базе. Сотрудник employee не может иметь подчиненных, а manager и sales могут. Для каждого типа сотрудников зарплата расчитывается по-разному и зависит от числа подчиненных. Нужно разработать схему БД для того, чтобы на языке высокого уровня можно было реализовать рассчет зарплаты.
Каким образом реализовать схему БД, чтобы показать иерархию сотрудников?
Три разных таблицы для employee, manager и sales? Но тогда как определить, кто у кого в подчинении?
Одна общая таблица employee, в которой есть референсы к таблице должностей и поле superior, которое может быть NULL и в котором указывается id начальника?
>>1015398 Опять выходишь на связь, мудило? >к таблице должностей Зачем она тебе? Что там хранится? Не вижу, пока, никакой проблемы в одной таблице employee с полем type, определяющим тип сотрудника. Чтоб нельзя было добавить обычному сотруднику подчиненных, сделаешь какой-нибудь constraint или триггер. Тут, конечно, надо смотреть на ТЗ и перспективы, а то окажется, что всё совсем не так. Если это bazi_dannih_laba4, то не еби мозги и делай как угодно.
>>1015416 Решается if-else или enum-ом в коде, а сущностью в БД. Опять же зависит от того, что за требования к системе. Если в системе сами пользователи могут на лету заводить новые типы сотрудников, задавать им какие-то свойства и т.п., без дополнительных таблиц никуда. Если у тебя всегда 3 типа сотрудников, то разруливай всё прямо в коде и не усложняй систему.
> Это как вообще? Почему выделенное компилится и работает? Две точки? Первый раз вижу. d. - название бд Второе d. - название схемы, в которой находится таблица emp_fact_value
>>1015530 sum([название таблицы]) ? Не, там фишка в том, что d это сокращённое название для таблицы, из которой происходит селект. emp_fact_value - это поле.
Если упростить, выглядит это как >select d.d.emp_fact value from d_table d Однако если писать такую хуету не в коде хранимки, а в обычном селекте, получается ошибка.
>>1015602 На бою компилить не буду, чтобы не наебнуть, а тест не обновлялся тыщу лет и там пакет не компилится по другим причинам. Скопировал отдельно запрос, запускаю. Результаты следующие. Замена первого алиаса на что угодно не ведёт к ошибке. Замена второго на что угодно ведёт к ошибке. Добавление третьего и последующего алиаса ведёт к ошибке. Если к полю из другой таблицы в этом деле селекте приписать второй алиас, валится ошибка. Такая магия, чувак.
>>1015625 Фантастика. Оказалось, что приписывать второй алиас можно для таблицы, которая подсоединена через лефт джойн, а для таблицы через иннер джойн - нельзя. Попробуйте. select t.t.field_name from dual left join vasha_tabla t on 1=1 Работает. Меняем лефт на иннер - ошибка. Oracle 11g И я жду пояснений.
Доказываем друг другу, что
>SELECT ID FROM b_entity_tvoya_mama
это тоже программирование,
Креэйтим индексы на одно и то же поле по 100 раз и инклудим в них всякие поля на всякий случай,
Храним gender в NVARCHAR(2000),
Поясняем, как можно без задней мысли хранить бизнес-логику в бд, а не в приложении,
Рассказываем, как обновлять хранилище данных актуальными real-time данными раз в минуту,
Называем логично и понятно поля в логичных и понятных таблицах
>CREATE TABLE tablica_s_clientami (
>ID_CLIENTA INT NOT NULL
>IMYA NTEXT,
>"DATA ROJDENIYA" NVARCHAR(MAX))
Ну и, конечно же, выбираем лудшую СУБД для всего:
MY SQL
MS SQL
PostgreSQL
ORACLE
MongoDB
SQLite
Excel
И даже Google Docs!
В общем, это очередной баз данных тред.