Вы видите копию треда, сохраненную 22 мая 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
в котором мы
-Выслушиваем, почему в шапке по-прежнему отсутствует инфа для вкативания
-Разбираемся, почему PostgreSQL - не Oracle
-Пытаемся понять, зачем нужен Тырпрайс, если есть бесплатный опенсурс
-Обсуждаем, какие новые тенденции хранения данных появляются в современном цифровом обещстве
-Решаем всем тредом лабы для заплутавших студентов и задачки с sql-ex для тех, у кого завтра ПЕРВОЕ собеседование
-Анализируем, как работает поиск вконтакте
-Игнорируем конкаренси-шизика, не понимающего, зачем базы данных нужны
-И просто хорошо проводим время, обсирая чужой код, не раскрывая, как писать правильно
Поехали!
Старый: https://2ch.hk/pr/res/1502870.html (М)
Есть БД, есть хранимая процедура, которая принимает как входные данные две даты и группу товаров, а на выходе даёт выборку по продажам товаров этой группы за указанный период времени.
В задании последним пунктом стоит:
"Вывести долю продаж с НДС товара, в каждом дне/магазине/группе товаров, отсортировать выборку по убыванию показателя"
Что от меня хотели и как это нужно было сделать? Мозга как включить данную выборку в уже существующий скрипт мне не хватило.
Как это сделать? Отдельными столбцами? Или есть ещё варианты?
Тэги нужны к каждой записи. Они могут быть уникальнми, а могут быть одинаковыми.
Да просто, пилишь отдельный столбец. Если это для отслеживания изменений, то slow changing dimension.
ХЗ, какая-то кривая формулировка могу только предположить что есть ещё один столбец который отвечает за ндс.
Итак, что у нас есть?
Есть Магазин, что-то типа id, имя
Есть Группа_товаров, что-то типа id, имя
Есть Товар, что-то типа id, группа_товаров_id, имя
Есть какие-то Продажи, что-то типа id, день, магазин_id, товар_id, цена_с_ндс
SELECT Продажи.день, Магазин.имя, Группа_товаров.имя, SUM(Продажи.цена_с_ндс) FROM Продажи
JOIN Магазин ON Продажи.магазин_id = Магазин.id
JOIN Товар ON Продажи.товар_id = Товар.id
JOIN Группа_товаров ON Товар.группа_товаров_id = Группа_товаров.id
WHERE Продажи.день >= {ДАТА-1} AND Продажи.день <= {ДАТА-2} AND Группа_товаров.имя = {ИМЯ-ГР-ТОВ}
GROUP BY Продажи.день, Магазин.имя, Группа_товаров.имя
Надеюсь нигде не ошибся. Проверьте, обругайте, плиз.
Да, разумеется есть отдельные поля "Продажа с НДС", "Продажа без НДС" и прочее.
>>551136
Мякотка в том, что выложить решение нужно в виде текста одной процедуры. То есть я так понял что в том же выводе инфы по продажам определённой группы товаров (или нескольких) за конкретный промежуток времени, а срез по магазину/группе товаров вроде как предполагает lifetime сумму по магазину/группе товаров, то есть where для этого запроса в основном селекте не будет работать.
Короче вот архив с дампом и заданием. Мне уже без надобности (только для общего развития и понимания где и насколько я дурак), но может кому будет интересно поковырять или на будущее как пример тестового задания (тут я ступил ибо знаний у меня не хватает - искал-то на интерна, а не джуниора).
Ответы на 1,2 и 3 могу скинуть или пообсуждать.
Вот как-то так
CREATE PROCEDURE test @date_1 date,
@date_2 date,
@group_ varchar(10)
AS
SELECT Продажи.день, Магазин.имя, Группа_товаров.имя, SUM(Продажи.день\Продажи.ндс100) AS Доля.продаж.ндс
FROM Продажи
JOIN Магазин ON Продажи.магазин_id = Магазин.id
JOIN Товар ON Продажи.товар_id = Товар.id
JOIN Группа_товаров ON Товар.группа_товаров_id = Группа_товаров.id
WHERE Продажи.день BETWEEN date_1 and date_2
GROUP BY Продажи.день,Продажи.ндс Магазин.имя, Группа_товаров.имя
HAVING Группа_товаров.имя=group_
ORDER BY SUM(Продажи.день\Продажи.ндс100)
EXECUTE test(date_1,date_2,group_)
а ещё звёздочка в сумме проебалась. хотя не уверен что сумма вобще там нужна в таком виде, но похуй пляшем, суть я думаю понятна
main:
___________________
| PROD | LIST_ID |
--------------------------
| a | 3 |
--------------------------
| a | 4 |
--------------------------
| b | 1 |
--------------------------
list:
___________________
| ID | LIST_VAL |
---------------------------
| 1 | 11 |
---------------------------
| 2 | 22 |
---------------------------
| 3 | 33 |
---------------------------
| 4 | 44 |
---------------------------
Нужно взять все строки из list и соединить их с каждой строкой из main (по полям main.LIST_ID и list.ID) и получить следующее:
______________________________
| PROD | LIST_ID | LIST_VAL |
--------------------------------------
| a | 1 | null |
--------------------------------------
| a | 2 | null |
--------------------------------------
| a | 3 | 33 |
--------------------------------------
| a | 4 | 44 |
--------------------------------------
| b | 1 | 11 |
--------------------------------------
| b | 2 | null |
--------------------------------------
| b | 3 | null |
--------------------------------------
| b | 4 | null |
--------------------------------------
Пробовал LEFT JOIN, но так он не все строки дает (те что с null'ами не выдает)
main:
___________________
| PROD | LIST_ID |
--------------------------
| a | 3 |
--------------------------
| a | 4 |
--------------------------
| b | 1 |
--------------------------
list:
___________________
| ID | LIST_VAL |
---------------------------
| 1 | 11 |
---------------------------
| 2 | 22 |
---------------------------
| 3 | 33 |
---------------------------
| 4 | 44 |
---------------------------
Нужно взять все строки из list и соединить их с каждой строкой из main (по полям main.LIST_ID и list.ID) и получить следующее:
______________________________
| PROD | LIST_ID | LIST_VAL |
--------------------------------------
| a | 1 | null |
--------------------------------------
| a | 2 | null |
--------------------------------------
| a | 3 | 33 |
--------------------------------------
| a | 4 | 44 |
--------------------------------------
| b | 1 | 11 |
--------------------------------------
| b | 2 | null |
--------------------------------------
| b | 3 | null |
--------------------------------------
| b | 4 | null |
--------------------------------------
Пробовал LEFT JOIN, но так он не все строки дает (те что с null'ами не выдает)
Процедура итак выводит данные о продажах, каждая строка выводит данные о продаже: дата, магазин (в контексте задания - Аптека), касса, наименование товара, количество, группа товара, цена с/без НДС, маржа etc и в конечном итоге сколько вместе с НДС было получено за эту продажу (продажа с НДС). Я так понял что требуется чтобы строка выводила ещё за компанию соотношение продажи с НДС с суммарной продажей с НДС за этот день; + соотношение с суммарной продажей в этом магазине; + соотношение с суммарной продажей по этой группе товаров.
Ок да, тут я ступил и не уточнил, поэтому два последних вывода (магазин и группа) могут трактоваться и как "за всё время" и, что более вероятно "за сегодня в этом магазине" и "за сегодня в этой группе товаров", но в таком случае первый вывод должен быть "за сегодня продажи с НДС всех групп товаров".
У тебя в LIST_ID значения 2 нигде нет, а если брать ID, то таблица будет без null
> LIST_ID
Вместо LIST_ID в последней таблице (с результатом) можно записать просто ID (я неправильно столбец назвал)
>вывести долю продаж с НДС товара, в каждом дне/магазине/группе товаров, отсортировать выборку по убыванию показателя"
> в каждом дне/магазине/группе товаров, отсортировать выборку по убыванию показателя
Ну хз, типо как то так, это для дня, по другим по аналогии.
CREATE PROCEDURE test @date_1 date,
@date_2 date,
@group_ varchar(10)
AS
SELECT Продажи.день, Магазин.имя, Группа_товаров.имя,
(SELECT Продажи.день\Продажи.ндс*100
FROM Продажи
WHERE Продажи.день= Продажи.Продажи.день) AS Доля.ндс.день
FROM Продажи
JOIN Магазин ON Продажи.магазин_id = Магазин.id
JOIN Товар ON Продажи.товар_id = Товар.id
JOIN Группа_товаров ON Товар.группа_товаров_id = Группа_товаров.id
WHERE Продажи.день BETWEEN date_1 and date_2
А может они хотели три таблицы имз процедуры, и груп бай по дню/магазину/группе. И к слову тут уже противоречие, они в процедуру отдают группу и просят по ней выборку, и тут же:
>отсортировать выборку по убыванию показателя в каждом дне/магазине/группе товаров
Чего блять? Мы хотим получить группу товаров по условию задачи, это изи GROUP BY , без вариантов, а потом нам ещё высирают пол абзаца условий, которые к групировке не имеют ни какого отношения.
Но я б таких пидоров хитровыебаных нахуй слал, непонятно что они в задаче хотят, так это еще на минуточку вакансия начального уровня.
>вывести долю продаж с НДС товара, в каждом дне/магазине/группе товаров, отсортировать выборку по убыванию показателя"
> в каждом дне/магазине/группе товаров, отсортировать выборку по убыванию показателя
Ну хз, типо как то так, это для дня, по другим по аналогии.
CREATE PROCEDURE test @date_1 date,
@date_2 date,
@group_ varchar(10)
AS
SELECT Продажи.день, Магазин.имя, Группа_товаров.имя,
(SELECT Продажи.день\Продажи.ндс*100
FROM Продажи
WHERE Продажи.день= Продажи.Продажи.день) AS Доля.ндс.день
FROM Продажи
JOIN Магазин ON Продажи.магазин_id = Магазин.id
JOIN Товар ON Продажи.товар_id = Товар.id
JOIN Группа_товаров ON Товар.группа_товаров_id = Группа_товаров.id
WHERE Продажи.день BETWEEN date_1 and date_2
А может они хотели три таблицы имз процедуры, и груп бай по дню/магазину/группе. И к слову тут уже противоречие, они в процедуру отдают группу и просят по ней выборку, и тут же:
>отсортировать выборку по убыванию показателя в каждом дне/магазине/группе товаров
Чего блять? Мы хотим получить группу товаров по условию задачи, это изи GROUP BY , без вариантов, а потом нам ещё высирают пол абзаца условий, которые к групировке не имеют ни какого отношения.
Но я б таких пидоров хитровыебаных нахуй слал, непонятно что они в задаче хотят, так это еще на минуточку вакансия начального уровня.
А как вообще может получится null, если все возможные значения list.ID(=main.LIST_ID) имеют соответствующее значение LIST_VAL?
Сейчас специально на Adventure Work попробовал написать схожий запрос, и упёрся как раз в то о чём я говорил - либо делаем групировку по товарам, либо лепим подзапросами всю эту парашу с ндс. Т.е. либо 3 таблицы с тремя групировками, либо одна с групировкой по группе товаров, и с агрегациями в шапке.
Только сейчас дошло, что это рарджпег
Только учти, что строки, содержащие null, тоже посчитает
А в ответ тебе бы сказали "Ты охуел, петюнь, ради твоего сраного ООП головного мозга мы новый топовый 4 головый сервак на голдовых зеонах с 4 терабайтами оперативы покупать не будем, пшёл нахуй."
Потому как на ORM подобная бизнес-аналитика примерно в такие системки и выливается, поскольку ни на что сложнее крудов он не заточен.
мои варианты (но они не атомарны)
1)
list.insert(i)
i.seq = getmax(i=> i.seq) +1
update(i)
2)
i.seq = list.IndexDocumentCount()
insert(i)
Петр, что вы там кукарекаете? Облака, сервера немодно комерческую тайну у чужого дяди модна?
Вынуждены вас расстроить, но расчет НДС стоимостью машинного времени в примерно аналогичную сумму оного НДС нас тоже не устраивает, так что вы по прежнему идете нахуй.
не работают на 2 типа
FROM max_price
WHERE price >= ALL (SELECT price FROM max_price)
Аноны, я чет не совсем понимаю как вот это работает
>= ALL
т.е. он сравнивает является ли price больше всех значений в таблице или равно наибольшему значению?
Чтоб было TRUE нужно чтоб все значение таблицы были =>
Блядь, так засунь в Group By свой айдишник. Тогда количество групп у тебя ровняться количеству строк в таблице, не?
>-Выслушиваем, почему в шапке по-прежнему отсутствует инфа для вкативания
>-Пытаемся понять, зачем нужен Тырпрайс, если есть бесплатный опенсурс
Прошу дать ответ.
1. Её никто не написал либо кому-то потом было лень её копипастить?
Фамилия | Год |Зарплата
Иванов | 2017 | 5000
Иванов | 2018 | 10000
Петров | 2017 | 7000
Петров | 2018 | 6000
Сидоров | 2017 | 5000
Сидоров | 2018 | 6000
Как выбрать отсюда записи, у которых зарплата в 2018 больше чем в 2017? Я думал сделать джоин с самим собой, но таблица огромная, примерно на миллион записей(много годов), в общем даже с индексом по фамилии это пиздец долго происходит, можно ли как-нибудь через сделать подзапрос?
Я умею писать процедуры в T-SQL, знаю как работают аналитические ф-ции, могу читать план запросов и немного их оптимизировать.
Какой у меня уровень?
Нуборешение: заджоинить выборку по 2018 с выборкой по 2017 и вывести записи с нужным условием.
Я тут на тренинги записался, по тамошним критериям:
Средний: хорошие теоретические знания, практические навыки
Продвинутый: отличные теоретические знания, практические навыки, опыт работы более 1 года
>Common Table Expressions
Бля, чото тоже попробовал не пойму как сделать
WITH Salary_total (Фамилия,Зарплата_2017, Зарплата_2018) AS
(
SELECT Salary.[Фамилия],
(
SELECT Salary.[Зарплата]
WHERE Salary.[Фамилия]=[Фамилия] and YEAR(Salary.[Год])='2017'
),
(
SELECT Salary.[Зарплата]
WHERE Salary.[Фамилия]=[Фамилия] and YEAR(Salary.[Год])='2018')
FROM [dbo].[Salary])
SELECT*
FROM Salary_total
У тебя хоть зарплата NULL, а у жабаскриптеров вообще undefined
В качестве решения не подходит тот факт, что данные за эти года меняться не будут и их можно вынести в отдельные таблицы? Таблица зарплат за 2017. Таблица зарплат из 2018.
Ну вынесешь ты, а толку? Чтобы сравнить нужно будет джоинить обратно
Вот запрос без Cte:
select
t.last_name
from tbl t
where t.year in (2017, 2018)
group by t.last_name
having count(distinct t.year) = 2 -- гарантируем наличие зарплаты у сотрудника и в 2017, и в 2018 году
and max(case when t.year = 2018 then t.salary else 0 end) > max(case when t.year = 2017 then t.salary else 0 end)
Бэкапишь базу и восстанавлиаешь ее на новом сервере.
Mpp базы данных погугли. Если не брать готовые решения, то некоторые умельцы прикручивали шардирование к postgres. Быстро скорее всего ни как. Только если структура данных позволяет, можно архив отделить, историю, но это не совсем горизонтально. Кратко - суть шардирования, распределять данные в зависимости от значения по разным сервакам.
Нет, ты подожди.
Допустим, у тебя есть таблица с зарплатами, там 10000 сотрудников (народ приходит и уходит) за 20 лет, в каждому году 12 месяцев, каждый месяц начисляют зп 2 раза (аванс + основа) = итого 10000 20 12 2 = не более 4 800 000 записей. Если это джойнить, то будет просто ахтунг.
Ты берёшь и выносишь зарплаты за 2017 в таблицу ЗП2017, а зарплаты за 2018 в таблицу ЗП2018. Теперь у тебя базе данных нет необходимости вычислять значение выражения для джойна для всех вообще записей, а вычислять будет только для тех кто работал в 2017 и 2018. Допустим из фирмы в 2017 и 2018 никто не уходил и не приходил и там работало 1000 человек. 1000 человек 1 год 12 месяцев 2 раза в мес зп = 24000 записи в каждой таблице.
Затем, считаешь сколько у кого была зарплата в 2017 и 2018 году. Помещаешь эти данные в таблицы ЗПСУМ2017 и ЗПСУМ2018, соответственно. То есть у тебя в каждой из этих таблиц будет 1000 записей (по числу сотрудников).
И пишешь запрос
SELECT *
FROM ЗПСУМ2017
JOIN ЗПСУМ2018 ON ЗПСУМ2017.имя = ЗПСУМ2018.имя
WHERE ЗПСУМ2018.зп > ЗПСУМ2017.зп
Если даже движок будет для каждого "имя" из таблицы "..2017" проходить по всем "именам" в таблице "..2018" то это будет всего лишь не более 1 000 000 сравнений, а если ты их ещё и отсортируешь, то будет вообще всё практически мгновенно. Сорян, за ключи не поясню, ибо не шарю в них.
Ну как вам такое, илоны маски?
Профессионалы, обоссыте если я хуеты написал, главно не бейте.
а ты хорош
Ну это говно и палки, куча лишних таблиц, куча лишних преобразований. А если у него доля записнй 2017-2018 высокая? Вон там выше анон изящный ответ зухярил
>В обще есть такая таблица.
>Как выбрать отсюда записи, у которых зарплата в 2018 больше чем в 2017?
>в общем даже с индексом по фамилии это пиздец долго происходит.
Не знаю зачем, но я сделал зачем-то пример реализации вообще без движка базы данных.
Возвращается такой файл :
Фамилия | Год | Зарплата
Иванов | 2017 | 5000
Иванов | 2018 | 10000
Сидоров | 2017 | 5000
Сидоров | 2018 | 6000
Option Explicit
'Программа делает выборку из строки файла с таблицей (первый параметр функции "Выбрать")
'двух указанных лет (второй и четвёртый параметры функции), для которых зарплата либо
'увеличивалась, либо уменьшалась, либо не менялась (третий параметрй функции)
'и записывает результирующюю строку с выбранной таблицей в другой файл.
'Настройки :
'Путь к файлу исходной таблицы :
Private Const ПуФаIN As String = "C:\Documents and Settings\Admin\Рабочий стол\Задачка на 2H\Таблица.txt"
'Путь к файлу результирующей таблицы :
Private Const ПуФаOUT As String = "C:\Documents and Settings\Admin\Рабочий стол\Задачка на 2H\Результат.txt"
'Первый год для выборки :
Private Const Год_1 As String = "2017"
'Второй год для выборки :
Private Const Год_2 As String = "2018"
'Разделитель между записями :
Private Const RZ As String = vbCrLf
'Разделитель между полями :
Private Const RP As String = " | "
'-------------
Private Type Год 'структура таблицы определённого года
ZP As Long 'зарплата
LФ As Integer 'длина фамилии
Ф As String 'фамилия
End Type
Private Sub Command1_Click() 'Сделать выборку в файл
Dim A As String, nF As Integer
'Прочитать файл исходной таблицы в строку :
If Len(Dir(ПуФаIN, vbNormal)) Then 'если файл существует
nF = FreeFile 'присвоить идентификатору файла свободный номер
Open ПуФаIN For Binary Access Read As #nF 'открыть файл
A = Space(LOF(nF)): Get #nF, , A 'читать файл в строку
Close #nF 'закрыть файл
Else
Call MsgBox("Файл :" & vbCrLf & vbCrLf & Chr(34) & ПуФаIN & Chr(34) & vbCrLf & vbCrLf & "не найден."): End
End If
'-----------------------------------------------
'Получить строку файла с записями двух указанных лет :
A = Выбрать(A, Год_1, "<", Год_2)
If Len(A) = 0 Then 'если функция вернула пустую строку
Call MsgBox("Исходный файл повреждён."): End
End If
'-----------------------------------------------------------
'Записать результирующий файл таблицы с выбранными записями :
Dim B As String: B = Left(ПуФаOUT, InStrRev(ПуФаOUT, "\") - 1) 'директория файла назначения
If Len(Dir(B, vbDirectory)) Then 'если директория назначения существует
If Len(Dir(ПуФаOUT, vbNormal)) Then 'если файл уже существует
If FileLen(ПуФаOUT) > Len(A) Then 'если файл больше, чем длина записи
nF = FreeFile: Open ПуФаOUT For Output As #nF: Close #nF 'стереть файл
End If
End If
nF = FreeFile 'присвоить идентификатору файла свободный номер
Open ПуФаOUT For Binary Access Write As #nF 'открыть файл
Put #nF, , A 'записать строку в файл
Close #nF 'закрыть файл
Else
Call MsgBox("Директория :" & vbCrLf & vbCrLf & Chr(34) & ПуФаIN & Chr(34) & vbCrLf & vbCrLf & "не существует.")
End
End If
'----------------------------------------------------------------------
Call MsgBox("Выполнено."): End
End Sub
'Возвращает строку файла с записями двух лет :
Private Function Выбрать(Табл_IN As String, Год1 As String, Соотношение As String, Год2 As String) As String
'Табл_IN - строка, в которой записан исходный файл таблицы
'Соотношение(зарплат) - ">", "<", "=" между первым и вторым заданным годом
Dim Г17() As Год, Г18() As Год, LГ17 As Long, LГ18 As Long 'таблицы за 17 и 18 год
Dim A As String, mA() As String, LmA As Long, mB() As String, mD() As String, k As Long, g As Long, q As Long
'Разделить исходную таблицу на записи :
If InStr(Табл_IN, RZ) < 1 Then 'если в файле нет разделителя полей
Exit Function
End If
mA() = Split(Табл_IN, RZ): LmA = UBound(mA())
'-------------------------------------------
'Создать две таблицы за 1 и 2 год :
ReDim Г17(LmA) As Год: ReDim Г18(LmA) As Год
For k = 0 To LmA
If Len(mA(k)) Then 'для не пустых строк
If InStr(mA(k), RP) < 1 Then 'если в записи нет разделителя
Exit Function
End If
mB() = Split(mA(k), RP)
If UBound(mB()) < 2 Then 'если в записи отсутствует поле
Exit Function
End If
If mB(1) = Год1 Then
With Г17(LГ17): .LФ = Len(mB(0)): .Ф = mB(0): .ZP = CLng(mB(2)): End With: LГ17 = LГ17 + 1
ElseIf mB(1) = Год2 Then
With Г18(LГ18): .LФ = Len(mB(0)): .Ф = mB(0): .ZP = CLng(mB(2)): End With: LГ18 = LГ18 + 1
End If
End If
Next k
'------------------------------------
'Создать результирующую таблицу :
A = mA(0): ReDim mA(LГ17 + LГ18) As String: mA(0) = A 'записать "шапку"
LГ17 = LГ17 - 1: LГ18 = LГ18 - 1: ReDim Preserve Г17(LГ17) As Год: ReDim Preserve Г18(LГ18) As Год
ReDim mB(2) As String: ReDim mD(2) As String: mB(1) = Год1: mD(1) = Год2
If Соотношение = "<" Then 'если надо для увеличивающейся зарплаты
For k = 0 To LГ17 'для каждой записи в таблице за 17 год
With Г17(k)
For g = 0 To LГ18 'перебрать все записи в таблице за 18 год
If .LФ = Г18(g).LФ Then 'если длина фамилии в таблицах совпала
If .Ф = Г18(g).Ф Then 'если и сама фамилия в таблицах совпала
Г18(g).LФ = 0 'отметить, что запись проверена(обнулить длину фамилии)
If .ZP < Г18(g).ZP Then 'если зарплата в 18 году больше, чем в 17
'Сделать две записи(за 17 и 18 год) в результирующую таблицу :
mB(0) = .Ф: mB(2) = CStr(.ZP): mD(0) = Г18(g).Ф: mD(2) = CStr(Г18(g).ZP)
q = q + 1: mA(q) = Join(mB(), RP): q = q + 1: mA(q) = Join(mD(), RP)
'--------------------------------------------------------------------
Exit For 'другие записи в таблице 18 года не проверять
End If
End If
End If
Next g
End With
DoEvents 'передать управление другим процессам в системе
Next k
ElseIf Соотношение = ">" Then 'если надо для уменьшающейся зарплаты
For k = 0 To LГ17 'для каждой записи в таблице за 17 год
With Г17(k)
For g = 0 To LГ18 'перебрать все записи в таблице за 18 год
If .LФ = Г18(g).LФ Then 'если длина фамилии в таблицах совпала
If .Ф = Г18(g).Ф Then 'если и сама фамилия в таблицах совпала
Г18(g).LФ = 0 'отметить, что запись проверена(обнулить длину фамилии)
If .ZP > Г18(g).ZP Then 'если зарплата в 18 году меньше, чем в 17
'Сделать две записи(за 17 и 18 год) в результирующую таблицу :
mB(0) = .Ф: mB(2) = CStr(.ZP): mD(0) = Г18(g).Ф: mD(2) = CStr(Г18(g).ZP)
q = q + 1: mA(q) = Join(mB(), RP): q = q + 1: mA(q) = Join(mD(), RP)
'--------------------------------------------------------------------
Exit For 'другие записи в таблице 18 года не проверять
End If
End If
End If
Next g
End With
DoEvents 'передать управление другим процессам в системе
Next k
Else 'если надо для не изменившейся зарплаты
For k = 0 To LГ17 'для каждой записи в таблице за 17 год
With Г17(k)
For g = 0 To LГ18 'перебрать все записи в таблице за 18 год
If .LФ = Г18(g).LФ Then 'если длина фамилии в таблицах совпала
If .Ф = Г18(g).Ф Then 'если и сама фамилия в таблицах совпала
Г18(g).LФ = 0 'отметить, что запись проверена(обнулить длину фамилии)
If .ZP = Г18(g).ZP Then 'если зарплата не менялась
'Сделать две записи(за 17 и 18 год) в результирующую таблицу :
mB(0) = .Ф: mB(2) = CStr(.ZP): mD(0) = Г18(g).Ф: mD(2) = CStr(Г18(g).ZP)
q = q + 1: mA(q) = Join(mB(), RP): q = q + 1: mA(q) = Join(mD(), RP)
'--------------------------------------------------------------------
Exit For 'другие записи в таблице 18 года не проверять
End If
End If
End If
Next g
End With
DoEvents 'передать управление другим процессам в системе
Next k
End If
ReDim Preserve mA(q) As String: Выбрать = Join(mA(), RZ)
'------------------------------------
End Function
>В обще есть такая таблица.
>Как выбрать отсюда записи, у которых зарплата в 2018 больше чем в 2017?
>в общем даже с индексом по фамилии это пиздец долго происходит.
Не знаю зачем, но я сделал зачем-то пример реализации вообще без движка базы данных.
Возвращается такой файл :
Фамилия | Год | Зарплата
Иванов | 2017 | 5000
Иванов | 2018 | 10000
Сидоров | 2017 | 5000
Сидоров | 2018 | 6000
Option Explicit
'Программа делает выборку из строки файла с таблицей (первый параметр функции "Выбрать")
'двух указанных лет (второй и четвёртый параметры функции), для которых зарплата либо
'увеличивалась, либо уменьшалась, либо не менялась (третий параметрй функции)
'и записывает результирующюю строку с выбранной таблицей в другой файл.
'Настройки :
'Путь к файлу исходной таблицы :
Private Const ПуФаIN As String = "C:\Documents and Settings\Admin\Рабочий стол\Задачка на 2H\Таблица.txt"
'Путь к файлу результирующей таблицы :
Private Const ПуФаOUT As String = "C:\Documents and Settings\Admin\Рабочий стол\Задачка на 2H\Результат.txt"
'Первый год для выборки :
Private Const Год_1 As String = "2017"
'Второй год для выборки :
Private Const Год_2 As String = "2018"
'Разделитель между записями :
Private Const RZ As String = vbCrLf
'Разделитель между полями :
Private Const RP As String = " | "
'-------------
Private Type Год 'структура таблицы определённого года
ZP As Long 'зарплата
LФ As Integer 'длина фамилии
Ф As String 'фамилия
End Type
Private Sub Command1_Click() 'Сделать выборку в файл
Dim A As String, nF As Integer
'Прочитать файл исходной таблицы в строку :
If Len(Dir(ПуФаIN, vbNormal)) Then 'если файл существует
nF = FreeFile 'присвоить идентификатору файла свободный номер
Open ПуФаIN For Binary Access Read As #nF 'открыть файл
A = Space(LOF(nF)): Get #nF, , A 'читать файл в строку
Close #nF 'закрыть файл
Else
Call MsgBox("Файл :" & vbCrLf & vbCrLf & Chr(34) & ПуФаIN & Chr(34) & vbCrLf & vbCrLf & "не найден."): End
End If
'-----------------------------------------------
'Получить строку файла с записями двух указанных лет :
A = Выбрать(A, Год_1, "<", Год_2)
If Len(A) = 0 Then 'если функция вернула пустую строку
Call MsgBox("Исходный файл повреждён."): End
End If
'-----------------------------------------------------------
'Записать результирующий файл таблицы с выбранными записями :
Dim B As String: B = Left(ПуФаOUT, InStrRev(ПуФаOUT, "\") - 1) 'директория файла назначения
If Len(Dir(B, vbDirectory)) Then 'если директория назначения существует
If Len(Dir(ПуФаOUT, vbNormal)) Then 'если файл уже существует
If FileLen(ПуФаOUT) > Len(A) Then 'если файл больше, чем длина записи
nF = FreeFile: Open ПуФаOUT For Output As #nF: Close #nF 'стереть файл
End If
End If
nF = FreeFile 'присвоить идентификатору файла свободный номер
Open ПуФаOUT For Binary Access Write As #nF 'открыть файл
Put #nF, , A 'записать строку в файл
Close #nF 'закрыть файл
Else
Call MsgBox("Директория :" & vbCrLf & vbCrLf & Chr(34) & ПуФаIN & Chr(34) & vbCrLf & vbCrLf & "не существует.")
End
End If
'----------------------------------------------------------------------
Call MsgBox("Выполнено."): End
End Sub
'Возвращает строку файла с записями двух лет :
Private Function Выбрать(Табл_IN As String, Год1 As String, Соотношение As String, Год2 As String) As String
'Табл_IN - строка, в которой записан исходный файл таблицы
'Соотношение(зарплат) - ">", "<", "=" между первым и вторым заданным годом
Dim Г17() As Год, Г18() As Год, LГ17 As Long, LГ18 As Long 'таблицы за 17 и 18 год
Dim A As String, mA() As String, LmA As Long, mB() As String, mD() As String, k As Long, g As Long, q As Long
'Разделить исходную таблицу на записи :
If InStr(Табл_IN, RZ) < 1 Then 'если в файле нет разделителя полей
Exit Function
End If
mA() = Split(Табл_IN, RZ): LmA = UBound(mA())
'-------------------------------------------
'Создать две таблицы за 1 и 2 год :
ReDim Г17(LmA) As Год: ReDim Г18(LmA) As Год
For k = 0 To LmA
If Len(mA(k)) Then 'для не пустых строк
If InStr(mA(k), RP) < 1 Then 'если в записи нет разделителя
Exit Function
End If
mB() = Split(mA(k), RP)
If UBound(mB()) < 2 Then 'если в записи отсутствует поле
Exit Function
End If
If mB(1) = Год1 Then
With Г17(LГ17): .LФ = Len(mB(0)): .Ф = mB(0): .ZP = CLng(mB(2)): End With: LГ17 = LГ17 + 1
ElseIf mB(1) = Год2 Then
With Г18(LГ18): .LФ = Len(mB(0)): .Ф = mB(0): .ZP = CLng(mB(2)): End With: LГ18 = LГ18 + 1
End If
End If
Next k
'------------------------------------
'Создать результирующую таблицу :
A = mA(0): ReDim mA(LГ17 + LГ18) As String: mA(0) = A 'записать "шапку"
LГ17 = LГ17 - 1: LГ18 = LГ18 - 1: ReDim Preserve Г17(LГ17) As Год: ReDim Preserve Г18(LГ18) As Год
ReDim mB(2) As String: ReDim mD(2) As String: mB(1) = Год1: mD(1) = Год2
If Соотношение = "<" Then 'если надо для увеличивающейся зарплаты
For k = 0 To LГ17 'для каждой записи в таблице за 17 год
With Г17(k)
For g = 0 To LГ18 'перебрать все записи в таблице за 18 год
If .LФ = Г18(g).LФ Then 'если длина фамилии в таблицах совпала
If .Ф = Г18(g).Ф Then 'если и сама фамилия в таблицах совпала
Г18(g).LФ = 0 'отметить, что запись проверена(обнулить длину фамилии)
If .ZP < Г18(g).ZP Then 'если зарплата в 18 году больше, чем в 17
'Сделать две записи(за 17 и 18 год) в результирующую таблицу :
mB(0) = .Ф: mB(2) = CStr(.ZP): mD(0) = Г18(g).Ф: mD(2) = CStr(Г18(g).ZP)
q = q + 1: mA(q) = Join(mB(), RP): q = q + 1: mA(q) = Join(mD(), RP)
'--------------------------------------------------------------------
Exit For 'другие записи в таблице 18 года не проверять
End If
End If
End If
Next g
End With
DoEvents 'передать управление другим процессам в системе
Next k
ElseIf Соотношение = ">" Then 'если надо для уменьшающейся зарплаты
For k = 0 To LГ17 'для каждой записи в таблице за 17 год
With Г17(k)
For g = 0 To LГ18 'перебрать все записи в таблице за 18 год
If .LФ = Г18(g).LФ Then 'если длина фамилии в таблицах совпала
If .Ф = Г18(g).Ф Then 'если и сама фамилия в таблицах совпала
Г18(g).LФ = 0 'отметить, что запись проверена(обнулить длину фамилии)
If .ZP > Г18(g).ZP Then 'если зарплата в 18 году меньше, чем в 17
'Сделать две записи(за 17 и 18 год) в результирующую таблицу :
mB(0) = .Ф: mB(2) = CStr(.ZP): mD(0) = Г18(g).Ф: mD(2) = CStr(Г18(g).ZP)
q = q + 1: mA(q) = Join(mB(), RP): q = q + 1: mA(q) = Join(mD(), RP)
'--------------------------------------------------------------------
Exit For 'другие записи в таблице 18 года не проверять
End If
End If
End If
Next g
End With
DoEvents 'передать управление другим процессам в системе
Next k
Else 'если надо для не изменившейся зарплаты
For k = 0 To LГ17 'для каждой записи в таблице за 17 год
With Г17(k)
For g = 0 To LГ18 'перебрать все записи в таблице за 18 год
If .LФ = Г18(g).LФ Then 'если длина фамилии в таблицах совпала
If .Ф = Г18(g).Ф Then 'если и сама фамилия в таблицах совпала
Г18(g).LФ = 0 'отметить, что запись проверена(обнулить длину фамилии)
If .ZP = Г18(g).ZP Then 'если зарплата не менялась
'Сделать две записи(за 17 и 18 год) в результирующую таблицу :
mB(0) = .Ф: mB(2) = CStr(.ZP): mD(0) = Г18(g).Ф: mD(2) = CStr(Г18(g).ZP)
q = q + 1: mA(q) = Join(mB(), RP): q = q + 1: mA(q) = Join(mD(), RP)
'--------------------------------------------------------------------
Exit For 'другие записи в таблице 18 года не проверять
End If
End If
End If
Next g
End With
DoEvents 'передать управление другим процессам в системе
Next k
End If
ReDim Preserve mA(q) As String: Выбрать = Join(mA(), RZ)
'------------------------------------
End Function
Да, не про пассаж от мамкиного программиста же
Тогда есть опыт 3+ лет с минимум одним законченным крупным проектом с и использованием ключевых навыков?
MS SQL
В таблицу добавил новое поле "Genre", оно не должно быть нуллом, но только в EDIT нет колонки Genre, что делать?
Да, сори что заспамил.
Ну заодно спрошу, чё с вопросиками делать? Когда ручками пишу запросы, кодировка сломана
Collation поменять на кириллицу, если еще не поменял.
И инсертить в nvarchar-колонку надо не
'Говно',
А
N'Говно'
Всем спасибо, хуйнул SUM в селекте, все норм стало. Нате трекич.
https://www.youtube.com/watch?v=U02mGktc7aA
Покеж код, интересно посмотреть шо ты там строишь.
У тебя ещё одной таблицы не хватает, с заказами, которое и сводит вместе покупателя и товар.
Для создания связи многие ко многим требуется дополнительная таблица.
Ты гет взял.
Спасибо, а то я видимо неправильно связал, у меня была 3тья таблица, не понял чё с ней делать
заебало вручную прописывать это говно ебаное
Он не кислый совсем
Ну смотри, чтобы связать список книг и список покупателей, тебе нужно как-то указать кто какие книги купил. Можно , конечно, в списке покупателей каждому покупателю добавить список книг которые он купил (и каждой книге - купивших её покупателей). Но несложно догадаться, что это не кошерно. Поэтому умные люди придумали делать таблицу, фиксирующую покупку - ид_покупки, ид_покупателя, ид_книг etc - и вот она связь многие ко многим посредством ещё одной таблицы.
Подробнее погугли «нормальные формы» вроде как
Допустим у меня несортированая таблица, делаю простой селект с топом, что произойдет?
1) Достанет всю таблицу, и отдаст мне 10 строк
2) Посмотрит 10 строк, а остальное смотреть не будет
А так ли это важно с учётом того, что в MySQL есть кеширование. Пока таблица, к которой ты делаешь запрос, не изменилась, ты будешь получать результат SELECT-а мгновенно из кеша.
Вариант 2, разумеется
Посоветуйте минимальную NoSQL-БД для докера с джава-клиентом, оптимизированную на быструю вставку огромного количества жсон-объектов размером около 1кб в минифицированном виде. Из операций требуются "взять N объектов" (не обязательно упорядоченно, но желательно самых старых) и "удалить N объектов по ключам".
Раньше был постгрес с хранением по столбцам, но чувствуется как оверкилл для микросервиса для приёма данных. И схему БД синхронизировать в нескольких местах сразу желания мало. Можно его, конечно, и жсоном кормить, но такое.
Попробовал использовать Redis с lettuce-клиентом, но тот захлёбывается во время сериализации - клиент жрёт только строки в качестве значений, а потому с каждым объектом сборщик мусора начинает умирать быстрее и быстрее. Ну и сохранность данных в кэш-базе - тема сомнительная.
Или смотреть вообще в другую сторону, какие-нибудь timeseries-базы?
МонгоДБ не подходит?
Алсо, если у тебя высокая нагрузка, может не менять базы, а использовать решения для балансировки нагрузки?
Можно попробовать кафку как персистентное хранилище юзать.
Cassandra вроде как на запись быстрая, но не "минимальная"
Суть именно в том, что один бэк совмещается с одной БД - нужен масштабируемый сервис-приёмник-данных. При увеличении нагрузки план в масштабировании всего сервиса, а не только базы. Монго - очень уж жирная, 150 МБ образ (alpine, видимо, для слабых), тонны коллекций, вот это всё. Редис привлекал именно свой минималистичностью.
>>557834
>>558199
Попробовал, всё же, постгрес с таблицей "id bigint, data json". Внезапно, производительность оказалась очень даже ничего, хотя и ощущается как тот ещё оверкилл (целый постгрес тянуть-то). С учётом дедлайнов придётся (по крайней мере, пока что) остановиться на таком решении. Не совсем понимаю, почему сборщик мусора не орёт из-за тонн сериализованных строк, но, видимо, lettuce - совсем ущербный клиент/драйвер.
В общем, вопрос пока что закрыт, но, в будущем, может открыться вновь.
Конечно, ты охуел, это же говно какое-то. Еще и в книжке какой-то написано. Предлагаю такой вариант, который то же самое достанет, только записано короче и работает быстрее.
Select distinct
C.CustomerId,
c.CustFirstName,
c.CustLastName
From Orders o
Inner join Order_Details od on o.OrderNumber=od.OrderNumber
Inner join Products p on od.ProductNumber=p.ProductNumber
Inner join Customers c on o.CustomerId=c.CustomerId
Where p.ProductName in (‘govno’, ‘govno2’, ‘govno3’, ‘govno4’)
Да пфф, прост не заметил, особо много не поменяется
Select
C.CustomerId,
c.CustFirstName,
c.CustLastName
From Orders o
Inner join Order_Details od on o.OrderNumber=od.OrderNumber
Inner join Products p on od.ProductNumber=p.ProductNumber
Inner join Customers c on o.CustomerId=c.CustomerId
Where p.ProductName in (‘govno’, ‘govno2’, ‘govno3’, ‘govno4’)
Group by
C.CustomerId,
c.CustFirstName,
c.CustLastName
Having count(distinct p.ProductName)=4
Хм да, впринципе разумно. Сначало хотел возразить что товаров то больше, но мы же их отфильтровали. блять а зачем эти пидоры тогда воротят это говно на три абзаца с жоинами
Потому что having не использует индексы, так что может быть вопрос в производительности.
Но даже если нужно использовать индексы, то лучше юзать
Where exists
and exists
And exists
And exists
Для каждого из 4 продуктов, чем тот калл с джойнами. Советую сменить книжку.
>лучше сначала
Двачую.
Я еще иногда пишу
Group by только по c.CustomerId
А все остальное запихиваю в max:
Select
C.CustomerId,
Max(c.CuatomerFirstName),
Max(c.CustomerLastName)
From ...
Group by c.CustomerId
Это просто агрегирующая функция, которую можно к строкам применять - максимум.
Можно min написать, результат такой же будет.
Она нужна, чтобы не группировать по имени и фамилии записи, они все равно по айдишнику клиента группируются.
Не знал что так можно через групбай протаскивать дополнительные строки
Время в секундах среднее на различные count() в таблице от 0 до 10кк записей с шагом в 1к, (981 итерация)
Я б посмотрел статистику по другим запросам. И вобще чот прохладная история, малоинформативно.
маркетинг
Да ладно, общеизвестнй факт, что оракл круче MS и My тем более.
Просто нужно иметь в виду, что она и дороже, и жрет больше, и сопровождается хуевее.
Я не фанат, между прочим, считаю говном оракл, но это известный факт, что он эти субд ебет в сраку, поэтому в банках всяких тока его и юзают.
Да я не против но от таблицы попахивает пиздежом, 0,001 на всех запросах, в то время как у конкурентов аремя разное. Либо там кэширование какое-то, либо условия разные.
>Scylladb
Первый раз про такое слышу.
ПРедставим, что ты IT-директор и принимаешь решение использовать небесную-лабораторию-баз-данных. У тебя есть 2 чела, которые умеют ее админить и юзать.
Через месяц их хантят и зовут на другой проект, где обещают столько денег, сколько ты им никогда дать не сможешь.
Как быстро ты найдешь спеца по такой штуке?
Вообще, вижу, очень популярная штука, судя по пикрилу с hh, явно стоит того, чтобы потратить свое время на ее изучение.
Она касандру заменяет.
Ну типо каунт у них ахуенный да, ну вставляет хуже пеонов. Да и третей базой хотя бы марию нужно.
ебани свой оракул в такой бенчмарк
https://tech.marksblogg.com/benchmarks.html
посмотрим, как он соснёт
а каунты фулсканом из
>>563202
для каких бд ёбта?
в обоих тестах каунты
У верхнего дебича еще сетап не указан. Что там и как, какие железки. У MS SQL колумн стор применён?
Вообще фул скан это чисто для аналитических бд. Макака выбрала какие-то дрищ базы устаревшие. Для таких задач используются движки из моей ссылки. А Оракул сосёт там. Это олтп база.
в каких файлах, дебич?
он просто пример привёл размера в коммон формате
там если на любой тест тыкнуть, написано, как он данные в базу загружает
В этом условии, получается он не выведет записи, в которых есть что-то помимо цифр?
А это можно без отрицания сделать?
Вобще все в один голос кричат что LIKE говно конструкция, и не стоит её использовать.
Спасибо. Вроде как то что надо.
Он к Муське не подключается, потому что он написан на джаве, а там через jdbc он у нее не понимает timezone, надо в самой субд UTC+3 прописать, это можно несколькими способами сделать.
Я слышал мнение что лайком любую более-менее большую базу можно поставить раком. К слову лучше использовать LEFT, вместо ^
а не, со скобками по другому работает, забей
Ну может из очевидного что-то, типа FK не в ту сторону или тип text вместо какого-то более подходящего для строк с именами и названиями.
Я нуфак совсем, первую свою БД проектирую.
енам ебашь
Возник еще вопрос, если нужно вывести зарплату каждого за 2017 и 2018, и гарантировать что они были, что делать?
Вот я добавил group by t.last_name, year чтобы были оба, но тогда having count уже не срабатывает, и вылезают сотрудники которые скажем в 2018 уже NULL, как быть?
Ты в чем такую хуевину сделал?
Аноны, а не подскажете, Postgres много ресурсов системы жрет? (Винда)
А в каком случае много? Не много - в смысле даже меньше вкладки хрома какого-нибудь?
да образные 100 метров оперативы. Много если начинаешь работать с базой делать боьлшие инсерты\селекты\итд.
https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms141696(v=sql.105)?redirectedfrom=MSDN
Смотри где "Specifying Parameters by Using Ordinal Positions"
Спасибо сосач, я решил эту проблему, сделав тупо SELECT name, MAX(prepod), MAX(urok), date ... GROUP BY date, name HAVING COUNT(urok) = 1 UNION SELECT name, MAX(prepod), 'penis', date ... GROUP BY date, name HAVING COUNT(urok) > 1
Няша, сам спросил, сам ответил, все бы так
Подскажите, хули так процессов Postgres'a много висит.
И че теперь pgAdmin только веб морда?
Десктоп приложением для винды не пользуется уже никто?
>И че теперь pgAdmin только веб морда?
Морда, которую мы заслужили. А вот нехуй было сливать индустрию обоссаным веб-дебилоперам, скоро клиенты всего только в виде вебморд будут.
Не подскажешь как это можно сделать?
Select
*
From (
Select
t.last_name,
max(case when t.year = 2017 then t.salary else null end) as salary_2017,
max(case when t.year = 2018 then t.salary else null end) as salary_2018
From tbl t
Where t.year in (2017, 2018)
Group by t.last_name
) t
Where t.salary_2017 is not null and t.salary_2018 is not null
В оракл все еще нейдобно работать с датами?
sqlite
Ебаный стыд, я всегда думал что транзакция сама всё что надо залочит. Какой же я был тупой.
Умоляю, аноны, не повторяйте моей ошибки. Прежде чем написать BEGIN в своём скрипте, обязательно прочитайте это:
https://dev.mysql.com/doc/refman/5.7/en/innodb-locking-transaction-model.html
просто отложите все свои дела и прочитайте и только потом уже программируйте. Не будьте как я.
Для белых людей ORM всё это делает за них, в коде пишется только `.update(status: :completed)`.
Это ещё хуйня. Мне как-то и этого не хватило, пришлось обмазываться DBMS_LOCK.
Раньше же был, если в имени ''@'%' пустые кавычки указывать.
Живу в Москве
Знакомые зная Sql на уровне больших запросов (без кодинга) зарабатывают
120-150 на руки
Я же получал мало и решил сменить работу.
Вроде знаю Sql получше них и тут жопа, за 10 собесов все отказы,прошу всего 120.
В одних местах на 120к хотят знания select * from,
В других задание с пика.
То и то решаю, но отказы, че делать, хз
А как понять, что от тебя хотят в задании?
Я запрос мб и написал бы, но че-то в логику не въезжаю.
Если расскажете, напишу вам запрос.
А понял
Select
Min(t.id) as min_id, max(t.id) as max_id
From (
Select
t, sum(t.is_chain) over (order by t.id) as group_num
From (
select
k.id,
Case when Lag(k.id) over (order by k.id) = k.id - 1 then 0 else 1 end as is_chain
From kall k
) t
) t
Group by group_num
Такие дела, это вам не сиськи мять
Быстро ты
Если правильно, то ты молодец
Я сидел почти весь день с ним и не мог допереть
Твой метод попробую для себя разобрать, как доберусь до базы
Я что-то тоже втыкаю уже минуты три.
Что они хочет?
>максимальное и минимальное значение группы
Чего блять? Как это к примеру относится?
Глупенький, там идут числа по порядку, но в некоторых местах порядок нарушается. Пока порядок не нарушен, это группа. Если после числа не идет следующее по порядку число, то он одиночка в своей собственной группе.
Анончики наверно не совсем по тематике, появилась необходимость автоматизировать работу, сменив эксельку на что то более гибкое.
с чего начать? где искать специалиста который занимается разработкой ПО, сколько это может стоить? ( усредненно)
Сейчас работаю в эксель +DataExpress, но знаний чтобы допилить и сделать все в одном месте не хватает.
pandas
> сменив эксельку на что то более гибкое.
с чего начать?
С изучения питончика.
> где искать специалиста который занимается разработкой ПО
На хх.ру. Или фл.ру.
> сколько это может стоить? ( усредненно)
100.
я не планирую сам делать программу, просто нужно найти кого то умеет. на удаленную работу.
Спасибо попробую покурить сайты
Ему не первый год для каждого автора, ему надо publication_year, count(writer_id) ... group by publication_year
Ну так ты понял или нет?
Тоже мимо.
>сколько авторов издали свою первую книгу в каждом из обозначенных годов
Значит, надо
SELECT y, count(id) FROM (
SELECT writers.id, MIN(publication_year) as y
FROM books JOIN writers
ON books.writer_id = writers.id
GROUP BY writer_id
) b
GROUP BY y;
Это что-то по данным. Сисадмины этим не занимался, разве что если они ещё и DBA.
Верстальщик, ты?
Как называется если он существует способ хранения записей, при котором при обновлении данных не обновляется существующая запись а создается новая с меткой времени актуальная запись-самая свежая, и где об этом почитать? я не смог придумать корректный запрос в гугле
Как называется если он существует способ хранения записей, при котором при обновлении данных не обновляется существующая запись а создается новая с меткой времени актуальная запись-самая свежая, и где об этом почитать? я не смог придумать корректный запрос в гугле
Так более читаемо
ок, спс scd тип 4 не зашкварный?
Пиздос, я всегда удаляю затираю данные редактированием, а в сервисах, написанных вот такими петухами, предыдущее значение навсегда останется.
Ещё вариант "версионирование данных".
Земля пухом.
А когда дрочишь, сперму свою тоже пробуешь каждый раз?
>Петухи пишут сервис
>Ой, кто там в системе поменял значение? Какое вчера было в системе?
>Сейчас посмотрю, скажу
>Сервис пишет мастер баз данных из /pr, который всех называет петухами и не соблюдает принципов историчности
>Ой, ГАЛЯ, кто там поменял значение? Какое вчера было в системе?
>Сейчас, надо восстановить бэкап базы, сейчас-сейчас, попредолимся пару часов, ой, ай, бэкап только на 23:00
>Жидко пернув, увольняется и идет искать новое место, где не будут предъявлять какие-то непонятные требования, типа ИСТОРИЧНОСТИ к его системам
Нормальные люди пишут при необходимости хранить ИСТОРИЮ пихают логи изменений в какой-нибудь эластик, а не засирают этим говном базу.
Ну конечно, нормальные люди только так и делают.
Ты в каждый проект еластик пихаешь? Дай угадаю, ты из тех, кто без еластика/докера/нод жс/монго и пр. работать не умеет, да?
Потом очень удобно все это поддерживать.
>а не засирают этим говном базу.
Бедненький, не можешь запрос написать, который последнюю строчку достает?
Вот здорово было бы, если бы в базе данных одна табличка была с одной колонкой и одной строчкой
База: DataDb
Таблица: Data
Колнока: Value
Тип данных - json
Ну ничего, научишься, там, глядишь, и на повышение пойдешь.
Просто он ниасилил нормализацию.
Анализом данных, больше всего это похоже на статистику. К базам данных отношение имеет лишь косвенное.
И тем, и тем.
Лучше на стыке расширяемости, скорости и более-менее несложности кода. Спасибо заранее.
Их значение неизвестно*.
>одна общая таблица со всеми мысленными и немысленными хешами
Ну давай разбирать по частям тобою написанное. Если твои хэши — это CRC32, то каждый из них занимает 32 бита, а возможных вариантов 232, т.е. пустая таблица всех значений займет 16 ГБ. Если же хэши, например, sha256, то каждый занимает 256 бит, а возможных вариантов 2256, тогда пустая таблица таких значений займет 70-значное число ГБ. Дисками уже закупился?
Догичное объяснение, всё понятно. Удачи.
Я бы на твоем месте копнул в сторону как вообще реализуются скидки. Мне кажется это уже на столько заезженная тема, что по ней есть бест практики на любой вкус.
Ага, а завтра у тебя с понедельника по четверг стоит 100 р, в пятницу 150, а выхи 300, как будешь делать?
Раз уж цена меняется по желанию левой пятки, то только так:
id | product_id | date | price
А на уровне логики каждый раз инсертить по несколько записей на будущее.
Двачую, вот так правильно.
Тогда можно сделать start_date и end_date.
Правда, вопрос в том, как сделать диапазоны непересекающимися. Можно написать тупой триггер, находящий самую близкую дату и чекающий, что всё норм.
Ещё вариант - только одно поле с датой, означающее "начиная с такой-то даты цена такая".
>Начиная с какой даты
best вариант, обеспечивает и гибкость, и гарантирует, что не будет пересекающихся диапазонов.
Первая же ссылка рабочая. Лучи добра тебе, анон
Таблица называется полносрезной.
Способ хранения - сырые не нормализованные данные. Есть куча способов, например ты можешь просто добавить столбец с датой загрузки, есть что-то похитрее. https://ru.wikipedia.org/wiki/Медленно_меняющиеся_измерения.
В основном об этом говорят, когда речь идёт о всяких больших данных
Но всё это довольно элементарно какие нахуй книжки, лол?
мимо инженер данных
Инженер больших данных, у вас спойлеры фрагментировались по всем постам, срочно пересоберите свой текст.
что нужно
1) инсерт и гет по id
2) автобалансровка , типо заканчивается место , добавляю еще компьютер и всё само настраивается
3) поддержка стриминга , типо могу в вебе перематывать
Тебе могут быть нужны старые данные не только на случай когда надо что-то срочно посмотреть, а как часть бизнес-логики приложения.
не нашел где скачать
1)Итак нужна БД ключ значение подойдет
2) будет 1 таблица , инсерт и get по id
3) Любая скажите ? а хуй там вот такое требование
Нужна БД которое займет минимально диска.
Попробовал совета одного "топ программиста" монгоДБ , размер чуть ли не в 3 раза больше стал чем данные лежали в .txt
>будет 1 таблица , инсерт и get по id
а чем собственно .txt файлы не устраивали? их можно гитом бэкапить, очень удобно
>нужно это делать моментально
моментально это сколько мс? если у тебя данных не дохуища, а в пределах гига, создай раздел в оперативке (tmpfs) и храни этот файл там. скорость такая будет, что ты охуеешь. если хочешь, чтобы знакомые "топ программисты" не кекали от реализации, замени файл на memcached или redis. запомни главное: соединяться с хранилкой ты должен не по сети, а через сокет. преобразование данных в пакеты и обратно - это такой тупейшний оверхед, что остальное уже не имеет значения.
21 терабайт. В .txt.
А вы знаете толк, мсье.
Бтв любая база займет ощутимо больше места из-за организации хранения информации. Типа
У меня тут появилась нужда сделать так, чтобы при помощи SQL процедуры как-то на удалённой машине вызвать завершение определённого процесса в Windows (ну или хотя запустить скрипт уже на компе, который сам это сделает, не суть).
Но за часы гуглинга я так ничего и не нашёл, а мне очень надо доделать этот проект на работе.
Тьфу, случайно отправил, не дописав.
Так вот, может есть какие-то возможные способы такое провернуть?
Или костыли?
Суть в том, что есть процедура, которая проводит некоторые проверки, и при условии, что некоторый параметр = true, то надо убить процесс на компе, который стриггерил процедуру.
Вот примерно так.
А какое решение ты можешь предложить для развёртывания?
Смотри.
Есть комп, на котором триггерится прожка на С#, которая при определённых условиях блочит его полностью.
Я делаю решение, которое позволит ответственному человеку разблокировать комп, введя логин и пароль.
Проблема в том, как загасить процесс программы на С#, используя SQL и какие-то может быть костыли?
Ну пускай твоя шарповная прога после блокировки компа начинает раз в пять секунд селектить табличку (например: id, user, time) и разблокировывать компутатор, а твой мальчик будет дергать процедуру, которая делает запись в эту табличку, права на нее дай только ему.
> 21 тб
Сомневаюсь, что всеми этими данными пользуются каждый день. Наверняка их можно разбить по годам по разным базам и какие-то базы положить на ssd, а какие-то на обычные диски.
Тогда делай свои индексы, раз тебе нужно минимум места и поиск реализовать.
Хотя можно попробовать покурить оракловые exteral table и их аналоги. Поиск есть, модификация данных есть, место займут только те табличные пространства, которые нужны для работы базы(относительно твоего объема - мизер).
Не та скорость, конечно, но твоим требованиям отвечает.
Как вообще такой монстр у тебя получился?
>незя, нужен поиск (читай начальный вопрос)
полуркай технологии яндекса типа clickhouse, возможно решает эту задачу. алсо, в /s спрашивал?
На тестовой базе данных 8.5mb 100.000 строк
Время выполнения цикла меньше 1 секунды
На полной базе данных 215mb 2.5млн строк
Время выполнения почти 5 секунд
Почему такая разница и что мне сделать чтобы сократить время?
Я ньюфаг, просьба не ругайте.
>на тесте мало строк
>на проде много
>что не так?
Всё так, хотя, ты скриптом обсчитываешь порции данных, а не весь набор разом, и у тебя хорошие диски и много оперативы, можешь в несколько потоков одновременно запускать свой скрипт на разные порции.
Вот только я не пойму.
Он берет одинаковый кусок в обоих случаях. И в обоих случаях этот кусок находится в самом начале бд. А разница получается от 0.4 сек до 4.5сек. Хотя всё идентично. Я бы еде понял, если бы скорость выполнения возрастала к моменту продвижения от начала базы, дак нет, она с самого начала низкая становится.
А, у тебя на одной порции данных скорость разная. Ты об этом не говорил.
Если бд на одном серваке лежат или на разных, но с одинаковой конфигурацией, то проблема скорее всего в запросе, не спец по монге, но мб там достаешь что-то не по ключу? Или по ключу, но индексы фрагментированы?
Мб проблема в сети между тестом и продом, если они в разных местах находятся
Мб вообще запрос работает одинакого, а питонский скрипт по обработе - по разному. Посмотри, сколько выбор именно занимает.
Эх, я же ньюфаня и ни одного твоего слова не понял.
Но я посидел и подумал.
Я делаю выборку по времени. И даю команду выбирать. И он выбирает, но пробегает по всей БД, проверяет все строки на соответствие моему запросу.
И если это так, то в чем преимущество баз данных? У меня получается как бы, какой-то построчный парсинг текстового файла.
И я думал что бд как раз существуют чтобы этого избегать.
индексы
У тебя БД - объектная - MongoDB, Она предназначена для того, чтобы доаставать данные по ключу. У тебя ключ - это день?
Ебаный рот, вообще, покажи код, которым ты из монги достаешь инфу, а то пока что все выглядит так, что ты ждешь какой-то магии, а ее не случается.
>Построчный парсинг текстового файла
Пока так и выглядит.
-------------------------------------------------------
Пацаны,спасайте,как так сделать?
Вижу там только поиск дубликатов по полям конкретной таблицы, это я и сам могу сделать. Но задача в том,чтобы это работало для любой таблицы. Или я в глаза ебусь и не вижу решения,ткни носом,пожалуйста
Тебе надо оптимальный вариант или хоть какой-то?
select count(★) -
(select count (★) from
(select distinct ★ from table))
from table
Такое ебаклакство с подзапросом из-за того, что count(distinct ★), вроде, не работает. А если работает - так ещё проще: count(★) - count(distinct ★).
Значит, это фича оракла такая.
Вот ответ для MS SQL сервер на основе метаданных и динамического sql. Нужно тока любую табличку записать в переменную
DECLARE @tbl_name sysname = 't_govno'
DECLARE @column_name NVARCHAR(MAX) = '';
SELECT
@column_name = @column_name + IIF(c.column_id = 1, '', ',') + c.name
FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
WHERE t.name = @tbl_name;
DECLARE @sql NVARCHAR(MAX) =
N'
select sum(row_count) as total_row_count
from (
select
{column_names}, count(1) as row_count
from {tbl_name}
group by
{column_names}
having count(1) > 1
) t';
SET @sql = REPLACE(@sql, '{column_names}', @column_name);
SET @sql = REPLACE(@sql, '{tbl_name}', @tbl_name);
EXEC (@sql);
MySQL
Если тебе нужно только КОЛИЧЕСТВО подсчитать, а не вывести их, то может быть так?
MariaDB []> SELECT * FROM t1 ORDER BY lol, kek;
+------+------+
| lol | kek |
+------+------+
| 1 | 2 |
| 1 | 2 |
| 1 | 2 |
| 1 | 3 |
| 1 | 3 |
| 1 | 4 |
+------+------+
6 rows in set (0.000 sec)
MariaDB []> SELECT `total`, `unique`, `total` - `unique` FROM (SELECT COUNT(★) as `total` from t1) q1 JOIN (SELECT COUNT(★) as `unique` FROM (SELECT DISTINCT ★ FROM t1) q2) q3;
+-------+--------+--------------------+
| total | unique | `total` - `unique` |
+-------+--------+--------------------+
| 6 | 3 | 3 |
+-------+--------+--------------------+
1 row in set (0.001 sec)
Допустим, у меня есть объект "касса" в БД. У кассы должен быть баланс, но я не хочу его записывать как поле, т.к. его придётся поддерживать консистентным.
Баланс у кассы изменяется посредством "финансовых операций" у которых есть "сумма". Собственно, баланс кассы это общая сумма всех операций (например операция зачисления положительная, операция списания отрицательная). Вот и хочу узнать, может есть в БД (postgres) такая функция как какое-нибудь кэшируемое поле, или оптимизированное, автоматически рассчитываемое, т.к. каждый раз пробегаться и суммировать все операции чтобы узнать баланс мне кажется это плохой идеей. Вдруг операций будет сотни и тысячи
Можно написать триггер, который видит, что обновляется колонка, и обновляет сумму. В постгресе трингеры есть. Даже в sqlite есть.
Вьюха - это по сути алиас для select-запроса, но некоторые вьюхи можно и апдейтить. Не знаю, как она поможет в твоём случае, всё равно её столбцы вычисляются в каждом запросе.
Триггеры/процедуры/функции - спорная практика, на самом деле, хоть так делают. В БД должны быть данные, а не логика. Но ради перформанса и консистентности приходится идти на некоторые жертвы.
Нет, триггер - это не гуд прэктис.
Начнем с того, как ты хочешь получать данные, какую систему ты используешь?
У тебя база служит основой для OLTP-системы или ты строишь аналитику?
баланс нужно возвращать для одного аккаунта или для пачки?
Если OLTP-система, то тебе нужно показывать данные в режиме реального времени, что можно сделать при помощи вьюхи (ПРедставление(View)) или функции. Если ты правильно проиндексируешь табличку, то все будет быстро работать.
Если аналитика, то тебе нужно создать механизм для расчета этого баланса и укладки его в отдельную витрину-табличку раз вкакое-то время, например, раз в 1 час.
user_id, event_date, balance
Соответственно, не нужено перерассчитывать каждый раз табличку полностью, достаточно посмотреть, по каким челам у тебя появились новые данные и рассчитать новый баланс на новые даты по ним.
В общем, как обычно, ни хуя не написал, что как где вообще, а ждёшь помощи. Ни хуя так не будет.
Есть, вообще, такой ресурс stack over flow, на котором можно что угодно спрашивать, проблема только в том, что там есть репутация, и половина вопросов, которые аноны тут задают, была бы там заминусована в виду недостатка начальной инфы.
Учитесь правильно задавать вопрос, господа, чтобы было коротко но ёмко.
Бля, чел, если бы тот анон знал столько же, сколько и ты, он бы не задавал таких вопросов.
Еще добавлю, почему тригер - не гуд практис, потому что он будет давать базе неявную нагрузку, и однажды ты увидишь у себя блокировки и не сможешь ни хуя заинсертить, пока тригер не отработает.
Еще один варик - это просто иметь расчитанное значение баланса в кажой строчке проводки, например
1. 2020-01-01 Вася пупки новый сумма = 0, баланс = 0
2. 2020-01-02 Вася пупки пополнение счета сумма = 200, баланс = 0 + 200 = 200 (просто прибавляем к текущему начению баланса эти 200)
3. 2020-01-03 Вася пупки снятие со счета сумма = -100, баланс = 200 - 100 = 100
И т.п.
>Допустим, у меня есть объект "касса" в БД. У кассы должен быть баланс, но я не хочу его записывать как поле, т.к. его придётся поддерживать консистентным.
Обычно в таких случаях UPDATE в принципе запрещен, а все изменения делаются с INSERT babos, reckord_id, familya_nakosyachvshego_pidorasa_slash_pyzdi.
Прям представляю: дали студенту в шараге лабу по базам данных, а он на следующей паре приносит супер-энтерпрайз-хайлоад-систему на полляма строк, учитывающую вообще всё, включая кассовые символа.
> Вьюха - это по сути алиас для select-запроса, но некоторые вьюхи можно и апдейтить. Не знаю, как она поможет в твоём случае, всё равно её столбцы вычисляются в каждом запросе.
В общем это сильно похоже на аннотацию, только удобнее работать как с реальной колонкой в БД.
>>584593
Вообще это внутренняя CRM система в небольшой компании, и на данный момент можно не париться о производительности, и что "баланс" каждый раз будет высчитываться как сумма всех операций на этом "балансе". Просто я хочу знать, как делать правильно, и сделать правильно.
Количество таких "балансов" будет небольшим. Думаю в пределах десятков, даже не сотен.> Учитесь правильно задавать вопрос, господа, чтобы было коротко но ёмко.
> Учитесь правильно задавать вопрос, господа, чтобы было коротко но ёмко.
Ну, чтобы хорошо гуглить, мне нужно хотя бы направление в котором гуглить. Узнать, есть ли что-то подобное, а дальше уже разберусь. Собственно, вот узнал про View, и это выглядит интересным, сейчас пойду луркать что это и как.
Спасибо, энивей.
>>584595
Двачую
>>584596
А это не дублирование данных? На первый взгляд не могу прикинуть какие профиты от такого подхода, ведь вместо этого можно записывать напрямую "баланс" в "кассе", а не в "операцию".
>>584606
> Обычно в таких случаях UPDATE в принципе запрещен
Я бы хотел вообще избежать ситуаций, где используются "соглашения" между программистами, т.к. доверять людям это очень ненадежно. Забыл/забил/етц. Достаточно лишь одной ошибки и концов уже не найдешь.
Баланс это всегда select sum(babos) group by account_id
Операции это всегда insert babos, account_id, прочая_мета_хуета into provodki, где babos может принимать как положительные, так и отрицательные значения.
> Я бы хотел вообще избежать ситуаций, где используются "соглашения" между программистами, т.к. доверять людям это очень ненадежно
Делаешь триггер на апдейт в котором всегда возникает ошибка.
>Баланс это всегда select sum(babos) group by account_id
Чем это отличается от того, что я сказал про расчет баланса при инсерте каждой новой строчки с операцией?
Ты прав во всем. Собственно, допустим этих записей babos тысячи и сотни тысяч. Это не плохо, если каждый раз для получения состояния "кассы" буду проходиться по всем этим тысячам записей? Этот вопрос больше всего интересует.
>Ты прав во всем. Собственно, допустим этих записей babos тысячи и сотни тысяч. Это не плохо, если каждый раз для получения состояния "кассы" буду проходиться по всем этим тысячам записей? Этот вопрос больше всего интересует.
Если поля, по которым ты группируешь индексированы , то нет.
Спасибо, анончик, я видел. Просто наличие дополнительных полей обуславливает необходимость поддержания консистентности. А в случае если надо будет изменить одну операцию в прошлом (исправление ошибок, опечаток, что угодно) то в этом случае нужно будет пересчитывать все последующие записи. Я рассматривал такой подход, но только если колонка "баланс" была бы в самой таблице "касса". Тогда бы при создании новой "операции" нужно было бы только прибавить или отнять от текущего баланса. Вот я бы хотел этого избежать. Вообще я бы хотел избежать добавление доп. полей чтобы избежать добавления триггеров и обработку кейсов в коде.
>>584734
Ну что же, это я и хотел услышать. Можно даже view не создавать а обойтись аннотацией
5-8 несложных таблиц, заполнение, ключи/ограничения, по паре хранимых процедур/функций и триггеров, минорная работа с доступом пользователей и резервными копиями. Программа максимум: набросать простенькую форму для работы БД
Суть в том что:
1. Это не мой профиль, но в теории умею
2. Сделано должно быть через 17 часов.
3. Я не сильно горю желанием.
Сколько денег запросить?
5 тыщ проси, если только структуру
А простенькую форму для работы с бд - это где, в аксесе, что ли? В пизду его шли с этим. Если не в аксесе, а в вебе - то это долго делать. В общем, не делай форму.
Вот кусок. Там дальше всякие махинации с этими данными. И рисование графиков по ним.
Вы забываете про двойную проводку еще
Сейчас прохожу курс для начинающих по sql, там пока все просто селекты и прочее, запилился на курс ради строчки в резюме для аналитика но вроде мне это понравилось. Как дальше развиваться? Что с этим sql делать можно? Базы данных проектировать или просто запросы писать? Этот момент я упустил
Если ты по базам данных угорать хочешь то это DBA - database administrator. Достаточно востребованная профессия. Правда у нас наверное не очень - их на галеры (наверное) мало набирают, если вообще набирают. А местных продуктовых контор не так много, ну и платят они (наверное) не очень, так с галерами конкуренции нет.
1. Вангую, что процесс 2 будет ждать коммита, и только потом сможет прочитать, вообще это значение.
Задачка с подвохом типа, думаю что на собеседовании в условиях стресса решил бы, как ты
2 ты сам можешь провенрить это в скл сервере на примере
да, сейчас сижу ковыряю сервер.
оказалось, что рид коммитед подвисает до момента коммита транзакции и в итоге и там, и там будет 1.
вернее, в момент Т3 там будет неопределенное состояние, так как транзакция не выдаст результат, но в некий Т5 в процессе 2 появится единица.
Чаво
Серьезно?
Это же полный пиздец, ждать завершения транзакции для чтения, что этот sql server себе позволяет?
Ага, так правильно.
Транзакции - излюбленная тема для собеседовальщиков, очень они на нее дрочат.
Еще, бля,
чем отличается табличная переменная от временной таблицы
В общем ни хуя нового, дроч вопросы, как на егэ.
Вообще, думаю, что устроится на рараба/аналитика баз данных проще, чем сдать егэ по любому предмету.
Куда дальше расти?
1) Задорочить яву/котлин со спрингом и ковырять дальше Ынтерпрайз уже пиля микросервисы.
+ работа всегда есть
+ джавистов всегда мало
+ штабильность
- могз ебет бизнес (хотя щас также)
2) Дальше пойти в Оракле
Развиваться в сеньеры/лиды дальше задрачивая DBD.
+ работа есть почти всегда
+ идти просто по накатанной
- порой пиздец скучна
- оракле начинают вытеснять другие базы
3) Идти в сторону универсального DBA+DBD.
Задрачивать Постгресы, Вертики, Терадаты и прочие МС-СиКуЭль. Можно быть дбд + дба.
+ знать много субд
- дба ещё более унылое чем в чистое дбд
4) Идти за мечтой и стать ДатаСиенце.
Задатки есть, знаю матан с универа, могу перемножить матрицы в питоне и знаю как строится перцептрон.
+ ЗП на порядок больше разрабов или дба
+ оч интересно
- большой риск остаться голодать
Что посоветуете? Есть 4 стула.
Куда дальше расти?
1) Задорочить яву/котлин со спрингом и ковырять дальше Ынтерпрайз уже пиля микросервисы.
+ работа всегда есть
+ джавистов всегда мало
+ штабильность
- могз ебет бизнес (хотя щас также)
2) Дальше пойти в Оракле
Развиваться в сеньеры/лиды дальше задрачивая DBD.
+ работа есть почти всегда
+ идти просто по накатанной
- порой пиздец скучна
- оракле начинают вытеснять другие базы
3) Идти в сторону универсального DBA+DBD.
Задрачивать Постгресы, Вертики, Терадаты и прочие МС-СиКуЭль. Можно быть дбд + дба.
+ знать много субд
- дба ещё более унылое чем в чистое дбд
4) Идти за мечтой и стать ДатаСиенце.
Задатки есть, знаю матан с универа, могу перемножить матрицы в питоне и знаю как строится перцептрон.
+ ЗП на порядок больше разрабов или дба
+ оч интересно
- большой риск остаться голодать
Что посоветуете? Есть 4 стула.
Дам банальный, но единственно верный, как мне кажется, совет - идти за мечтой.
Советую только сразу отбросить мысли о большой зп. В дата сайнсе даже после топового образования в шаде многие идут за 60к стажироваться в яндекс. Много получают звезды, стать которой можешь и ты вполне, если правда этим горишь, а не потому что навыдумывал себе хорошую зп.
Знаешь ли ты математики, нужные для дс? Они вообще конечно не очень сложные, но поднимать с нуля тервер, матан, статистику и методы оптимизации может быть не так просто. Без них можно быть успешным конечно, но это не сильно отличается от проги обычной, даже в худшую сторону на мой взгляд. По перезапускаешь модельки с разными коэффициентами в поисках оптимальных. Нейронки чуть сложнее, но тоже не сильно отличаются по-моему. Ну и результаты твоей работы не видны сразу и оценить их непросто.
В любом случае, если текущая работа совсем не в каеф, меняй конечно. Дба точно минус, уныло же. Дальше в оркл кажется аналогично. Бекенд в принципе норм. Ещё можешь посмотреть в сторону дата инженера (по сути собираешь пайплайны для тех же мл-ей, не сильно отличается от работы с базами, но чуть веселее) или аналитиков, которые рисуют картинки в табло или чем-то аналогичном (опять же опыт работы с бд почти релевантный, + не надо учиться кодить)
есть поломки на этих устройствах, в поле записываются их причины
нужно найти повторяющиеся причины поломки на устройстве
каким образом можно это найти, может есть какие то функции которые помогут сосчитать? я уже не знаю куда копать(
так же реквестирую годную литературу что можно почитать по postgresql
with
city_filial as (
select c1.city_name as city
, c1.city_id id
, case when c1.parent_city_id is null then c1.branch_name else c2.branch_name end as filial
from cep_city c1
left join cep_city c2 on c1.parent_city_id = c2.city_id
where c1.city_id not in (-1,0)
select filial
, count() as "Аварий"
, count(distinct net_address) as "Уникальных устройств"
, count() - count(distinct net_address) as "Повторных аварий"
, 100(count() - count(distinct net_address))::float/count(*) as value
from cep_accident_guts left join city_filial using (city)
where
start_time BETWEEN '2020-01-24T00:47:54.153Z' AND '2020-01-24T06:47:54.154Z'
and event_type in ('Причина поломки 1','Причина поломки 2','Причина поломки 3')
group by 1 order by 5 desc
Обоснуй
>>585936
>В дата сайнсе даже после топового образования в шаде многие идут за 60к стажироваться в яндекс.
Яндекс - клоака зловонная. ЗП там деймеингуют очереди из вайтишников. Плюс ебучая академия Яндекса которая набирает себе мясцо по ценам 2014 года. Джуны/мидлы получают там хуйню, особенно первые. Посоны ДС даже в нашем мелкобанке получали 100 как джуны, от 160 как мидлы.
>>585944
> Знаешь ли ты математики, нужные для дс? Они вообще конечно не очень сложные, но поднимать с нуля тервер, матан, статистику и методы оптимизации может быть не так просто.
Учился на математка. В универе 4 года назад это проходил. Думаю осилю. По задачам для выкатывания посмотрел там не очень сложно: СЛАУ, ДУ, производные, операции над матрицами, комбинаторика. Все знакомо.
> В любом случае, если текущая работа совсем не в каеф, меняй конечно.
Не прям чтобы до тошноты, но понимаю что этим заниматься смогу ещё максимум пару лет, дальше начнется выгорание. Поэтому ищу способы разнообразить рабочий процесс.
>Ещё можешь посмотреть в сторону дата инженера (по сути собираешь пайплайны для тех же мл-ей, не сильно отличается от работы с базами, но чуть веселее) или аналитиков, которые рисуют картинки в табло или чем-то аналогичном (опять же опыт работы с бд почти релевантный, + не надо учиться кодить)
Вот это гляну. Оттуда легче перекатится в DS.
Я совсем зеленый, но интересно стало.
Такой вопрос:
Можно ли задавать условия вывода?
К примеру:
SELECT id, name FROM table1 WHERE id>=2
Именно интересует этот момент: WHERE id>=2
Будет ли это работать и работать корректно? Выведутся ли мне результаты из таблицы с id от 2 и выше?
>Яндекс - клоака зловонная. ЗП там деймеингуют очереди из вайтишников. Плюс ебучая академия Яндекса которая набирает себе мясцо по ценам 2014 года. Джуны/мидлы получают там хуйню, особенно первые. Посоны ДС даже в нашем мелкобанке получали 100 как джуны, от 160 как мидлы.
Типично для славянских хуесосов, которые конкурируют исключительно демпингом.
На началах (если время позволяет) можешь в SoloLearn начать. Получишь немного теории, познакомишься с синтаксисом.
Знатоком и экспертом после курса в сололирн ты не станешь, это лишь самое начало.
Уже в процессе. Но что дальше ботать? Плюс опять же нужна практика, пусть хоть и из примитивный заданий.
братик, сейм щит, задрачиваю сейчас один курс, думаю дальше попробовать в развертывание/DBD но хз где материал брать
Ну так обсуждать СУБД - это не принт в цикле на питоне сделать.
Как в программировании: двигаться с концов массива в его центр
Решаю задачку с скл-ех 125, чет ваще никак
Lag/lead, или курсор
Есть таблица table1(id, name)
где id является ключом. Поле name может повторяться.
Задача: написать один запрос, который удалит все дубликаты. Т.е. значения в колонке name станут уникальными, но множество, составленное из значений колонки name не должно изменится.
Если есть два кортежа (1, 'abc') и (77, 'abc') остаться может любой из них.
select
t.name
,min(t.id) as min_id
into temp_table
from "table1" t
group by name
truncate table "table1"
insert into table1 (id, name)
select id, name from temp_table
>складскую БД на Access_und_VBA
Нафига, если рано или поздно придётся интегрироваться с какой-нибудь 1С-парашей. Бери сразу Odin-Ass.
>интегрироваться с какой-нибудь 1С-парашей
Никто нам в прорабку, в чисто поле, не поставит 1С. Буквально пару прорабов и кладовщик будет кнопки жмакать. ну может еще сводные отчеты будет в ворд генерить и по почте отсылать.
Cпасибо.
И я двачую.
Мне он видится таким логичным, в отличии от хаотичного css - жабаскрипта.
Удивляюсь, как многие фронтовики смогли выдрочить все эти ангуляры с реактами, на которых голову сломать можно, а простой понятный скл асилить не могут.
Использую postgres.
Я хочу создать виртуальную таблицу (view) что того чтобы хранить в ней "готовые рассчитываемые поля", чтобы каждый раз не прописывать их в запросах.
На пике изображено что я хочу. Есть чек, к чеку привязываются позиции. Сумма всего чека формируется из "суммы сумм" его позиций. Собственно я хочу, чтобы колонка "Чек.сумма" было виртуальным, а не физическим. В postgres есть функция виртуальных колонок, но она не позволяет обращаться к related объектам. Триггеры использовать пока не хочу.
Собственно вопрос:
Можно ли как-то связать таблицу и её отображение хотя бы какой-нибудь связью? Чтобы поле суммы было как можно ближе к записи "Чек"?
Картинка отклеилась
А какие предложения лучше?
Я в принципе сделал, что хотел, и скажу что моя ошибка это размышление о БД терминами ORM. В итоге сам загнал себя в угол и искал несуществующие вещи.
Но если есть какое-нибудь решение лучше, буду рад выслушать.
Имеется аналог airbnb, люди ставят время, когда хата доступна для сдачи. Хата может быть недоступна не только потому, что её заняли, но и потому, что хозяин не хочет её выставлять сам живёт в данный момент в ней
Я замутил таблицу exposed_days, где хранятся дни, когда хата доступна (единственный минус (имхо) такой реализации - диск засирается)
Коллега говорит, что дни тупо хранить, надо хранить ренджи. Я решил сделать бенчмарк, но по-видимому ренджи сильно сосут у хранения отдельных дней или я просто не могу в запрос
Задача такова: выбрать свободные даты на ближайший месяц.
Реализация с ренджами:
Дни, когда хата доступна в принципе:
exposed_dates
daterange: daterange
home_id: int
Дни, когда хата занята:
reserved_dates
daterange: daterange
home_id: int
invite_id: int
Запрос, который ищет свободные даты:
SELECT h.id, generate_series(lower(daterange), upper(daterange), '1 day'::interval) AS available_dates FROM exposed_dates
JOIN homes h ON exposed_dates.home_id = h.id
EXCEPT
SELECT h.id, generate_series(lower(daterange), upper(daterange), '1 day'::interval) FROM reserved_dates
JOIN homes h ON reserved_dates.home_id = h.id
Уже для 100к записей он работает полсекунды. При этом я не могу пользоваться вычитанием ренджей, т.к. там DISJOINT ошибка - result of range difference would not be contiguous
Можно как-то улучшить этот запрос?
при реализации с отдельными днями сет из 100к свободных дней при таких же условиях отрабатывает за 70мс
Имеется аналог airbnb, люди ставят время, когда хата доступна для сдачи. Хата может быть недоступна не только потому, что её заняли, но и потому, что хозяин не хочет её выставлять сам живёт в данный момент в ней
Я замутил таблицу exposed_days, где хранятся дни, когда хата доступна (единственный минус (имхо) такой реализации - диск засирается)
Коллега говорит, что дни тупо хранить, надо хранить ренджи. Я решил сделать бенчмарк, но по-видимому ренджи сильно сосут у хранения отдельных дней или я просто не могу в запрос
Задача такова: выбрать свободные даты на ближайший месяц.
Реализация с ренджами:
Дни, когда хата доступна в принципе:
exposed_dates
daterange: daterange
home_id: int
Дни, когда хата занята:
reserved_dates
daterange: daterange
home_id: int
invite_id: int
Запрос, который ищет свободные даты:
SELECT h.id, generate_series(lower(daterange), upper(daterange), '1 day'::interval) AS available_dates FROM exposed_dates
JOIN homes h ON exposed_dates.home_id = h.id
EXCEPT
SELECT h.id, generate_series(lower(daterange), upper(daterange), '1 day'::interval) FROM reserved_dates
JOIN homes h ON reserved_dates.home_id = h.id
Уже для 100к записей он работает полсекунды. При этом я не могу пользоваться вычитанием ренджей, т.к. там DISJOINT ошибка - result of range difference would not be contiguous
Можно как-то улучшить этот запрос?
при реализации с отдельными днями сет из 100к свободных дней при таких же условиях отрабатывает за 70мс
Как минимум можно один раз join делать с homes. Потом в инете есть норм решения по "result of range difference would not be contiguous".
Бред какой-то. Хранить нужно даты, и не exposed, а все вместе. У даты должен быть статус и опциональная связь с арендатором. Тогда можно для хозяина сразу рисовать календарь с именами в занятых клетках.
Типа сделать связующую таблицу date_id host_id, где date_id ссылается на конкретную дату?
- определить количество уникальных наименований .
- определить кол-во артикулов входящее в каждое из уникальных наименований.
- разделить прайс на группы с 01 по 99 по номеру артикула, где номер группы это 5 и 6й символы.
- определить кол-во артикулов в каждой из групп.
- определить кол-во уникальных наименований в каждой из групп.
- последние 2 пункта вывести в виде отчета: Группа, Кол-во артикулов, Кол-во уникальных наименований.
таблица вида:
Номер | Имя | Время |
z56 |Item1 | 11-12 |
x33 | item2| 12-20 |
z26 |item1 | 01-25 |
h33 |item2 |21-30 |
1. SELECT DISTINCT count(item )FROM t1 GROUP BY item
2. SELECT DISTINCT count(nomer) FROM t1 WHERE nomer = (SELECT DISTINCT count(item )FROM t1 GROUP BY item) GROUP BY nomer возможно ошибся в подзапросе
3 плохо формализована задача или я туп ХЫ
Сап господа
Есть warehouse (sql server) в виде star schema и два релейдет вопроса.
1.
Есть проблема с производительностью, так как у определенных компаний данных много (пару миллионов), следовательно запросы с тонной джоинов и предикатов длятся долго, индексы, где они имеют место, само собой присутствуют.
Денормализация не везде возможна и не сильно спасает
Что обычно в таких случаях делают?
Вопрос скорее с точки зрения любопытства, на практике я никаких инициатив пропихнуть не смогу
2.
Используется ORM, так что запросы в итоге делаются через sp_executesql
Что выливается в parameter sniffing и в просадки по производительности:
Почистили кэш, сделали запрос для мелкой компании, план запроса попал в кэш, делаем запрос для крупной компании - ловим timeout из-за того что используется неоптимальный план.
Какие выходы из этой ситуации?
На данный момент на каждый запрос в подобных местах стоит option recompile, но это определенно не выход.
>>550940
Если это оракл, то тебе надо делать 2 типа данных уровня схемы. Один просто is object, а другой is table of. Процедуры не умеют возвращать значения в привычном виде, но могут через out параметр.
Параметры in - даты, группы товаров. На out - коллекция через bulk collect. Как правило так не делается, тем более это можно сделать через функцию. А если нельзя прокинуть предикат то юзается pipeline-функция.
Если я правильно понял, то ты поддерживаешь реализацию, где хранятся отдельные дни.
Выставил с 10 по 20 - создается 10 записей с датами. Так?
>перед собесом сделать скрипт, парсящий любой каталог и собирающую инфу в бд
ты им хочешь таск закрыть?
Ваще не вопрос. Гугли "create domain"
Открыл для себя редгейт, понравилось, появилась зависимость. А потом у него кончилась двухнедельная триалка:(
Реквестирую советы как обойти его защиту, так как тулы топовейшие, а 1500 баксов в год платить не могу
Мне тянка на новый год подарила RedGate AutoComplete Для SSMS.
Долго страдал, но бабок зажимал, в итоге она мне предложила в подарок, кек.
ПОДАРИЛИ ПРОГРАММУ.
На рутрекере есь старые версии, но они все убищные.
Кстати, раньше в redgate работал еще ключ
i need more time
Который еще на какое-то время давал с ним поработать.
Да про ключ знаю, пробовал, уже не работает.
С ресетом триала не получается. Пробовал удалять, чистить руками реестр и все записи о редшейте и это не помогает. Он при установке разварачивает свой сервис на 22223 порту, а тот шлет на их серв полный конфиг системы и получает ответ что триалка на этой машине уже запускалась. В общем, судя по всему, оно сейчас не ломается
Если он разваорчивает сервис, мб надо сервис стопнуть?
Datediff
Начал копать сюда. Но никак не могу понять почему же все-таки он зависает, и почему он делает это не всегда.
Профайлер запускай и выпаливай, что долго работает.
Что тут посоветовать еще.
Мб запрос и быстро отрабатывает, но его тчо-то лочит (незакрытая траза какая-нибудь)
А мб и долго, потому что оптимизатор mysql не может построить план, например.
Да до хуя причин есть, нет смысла их все перечислять без первичной диагностики, выпаливай запрос через профайлер, потом уже смотреть можно будет.
И что, заработало?
Мне нужно найти документы типа t1, которые имеют связанный документ типа t2 и у которых не совпадает поле BRANCHID. Например на скрине это документ с ID=3, который связан с документом ID=6
Я написал говно#1:
select from DOCUMENT d
join LINKEDDOC ld on ld.DOCID = d.DOCID
where d.DOCTYPEID = t1
and d.BRANCHID not in
(select d1.BRANCHID from DOCUMENT d1
join LINKEDDOC ld1 on ld1.DOCID = d1.DOCID
where d1.DOCTYPEID = t2)
И говно#2:
select from BASE_ORACLE.DOCUMENT d1
join LINKEDDOC ld1 on ld1.DOCID = d1.DOCID
join (select * from DOCUMENT d2
join LINKEDDOC ld2 on ld2.DOCID = d2.DOCID
where d2.DOCTYPEID = t2) d3
on d1.BRANCHID != d3.BRANCHID
where d1.DOCTYPEID = t1
Оба говна не работают. Халп!
Мимо нюфаг написал говно:
select doc_h.Docid_h Docid_h, doc_h.Docid Docid, doc_h.globaldocid globdoc
from (select d.docid Docid_h, ld.docid Docid, d.branchid branchid, d.doctypeid doctypeid
from documet d join linceddoc ld
on d.globaldocid=ld.globaldocid
where d.doctypeid = 't1') doc_h join document d
on doc_h.Docid=d.docid
where doc_h.branchid!=d.branchid
Это вообще и не сработает наверное.
Первый docid в котором id главного документа.
Там подзапрос возвращает таблицу в которой два столбца docid. Первый из document (Docid_h), второй из linkeddoc (Docid).
Нет, лол, это реальная таска
По отдельности я два корявых запроса написал, а как объединить их теперь, не знаю.
А если делать через join все? Будет ли это максимально плохо?
select *
from
(select resuit.monts_reg monts_reg, count(reg.user_id) registr
from
(select reg.user_id, reg.monts_reg, log_first.monts_log
from
(select user_id, DATE_FORMAT(event_date, "%m") monts_reg
from events
where event_type= 'register'
group by user_id
order by user_id) reg
join
(select user_id, min(DATE_FORMAT(event_date, "%m")) monts_log
from events
where event_type= 'login'
group by user_id
order by user_id) log_first
on reg.user_id=log_first.log_id ) resuit
group by resuit.monts_reg) register_count
join
(select resuit.monts_log monts_log, count(reg.user_id) login
from
(select reg.user_id, reg.monts_reg, log_first.monts_log
from
(select user_id, DATE_FORMAT(event_date, "%m") monts_reg
from events
where event_type= 'register'
group by user_id
order by user_id) reg
join
(select user_id, min(DATE_FORMAT(event_date, "%m")) monts_log
from events
where event_type= 'login'
group by user_id
order by user_id) log_first
on reg.user_id=log_first.log_id ) resuit
where resuit.monts_reg+1=resuit.monts_log
group by resuit.monts_log) login_count
on register_count.monts_reg=login_count.monts_log
А если делать через join все? Будет ли это максимально плохо?
select *
from
(select resuit.monts_reg monts_reg, count(reg.user_id) registr
from
(select reg.user_id, reg.monts_reg, log_first.monts_log
from
(select user_id, DATE_FORMAT(event_date, "%m") monts_reg
from events
where event_type= 'register'
group by user_id
order by user_id) reg
join
(select user_id, min(DATE_FORMAT(event_date, "%m")) monts_log
from events
where event_type= 'login'
group by user_id
order by user_id) log_first
on reg.user_id=log_first.log_id ) resuit
group by resuit.monts_reg) register_count
join
(select resuit.monts_log monts_log, count(reg.user_id) login
from
(select reg.user_id, reg.monts_reg, log_first.monts_log
from
(select user_id, DATE_FORMAT(event_date, "%m") monts_reg
from events
where event_type= 'register'
group by user_id
order by user_id) reg
join
(select user_id, min(DATE_FORMAT(event_date, "%m")) monts_log
from events
where event_type= 'login'
group by user_id
order by user_id) log_first
on reg.user_id=log_first.log_id ) resuit
where resuit.monts_reg+1=resuit.monts_log
group by resuit.monts_log) login_count
on register_count.monts_reg=login_count.monts_log
Не знаю про "где посмотреть", но типичный кейс с ETL с использованием хадупа -- это реплицировать редко используемые, не апдейтящиеся данные с какой-нибудь активной дорогой бд на дешевый хадуп.
Но это довольно тяжело представить в виде пет проекта
Чем больше подзапросов тем хуже.
Даёшь CSV!
>make every programm a filter
чтоб фильтровать прыщеблядей пердолящих сосноль от нормлаьных людей
cat db.json | jq -r '.items | sort_by(.col2)[] | select(.col1 == 123) | [.col1, .col2] | @tsv'
cat db.json | jq -r '.items | map(select(.col1 == 123)) | sort_by(.col2)[] | [.col1, .col2] | @tsv'
А вот XPath так не умеет.
Сразу видно нормального человека, не сидящего в /s/.
> чтобы отсеивать линуксоидов, проводящих всё свободное время в эмуляторе терминала
sqlite говорят норм
>А есть ли вообще хоть одна причина юзать монгу?
С монгой тебе не нужно искать оправданий тому, что ты не можешь написать оптимизированный запрос на SQL.
Пердящие деды из 70-х писали настолько эффективный код, что бизнес-задачи целой корпорации требовали меньше железа, чем одна страница с реактом в 20-х.
Причем у тут деды? Они бы охренели, от rps и бигдат, которыми мы не напрягаясь рулим.
А реакты хотят пользователи.
Мы бы обошлись command line tools.
upd. порывшись в самых глубоких клоаках китайских интернетов, нашел рабочие кейгены для большинства продуктов редгейта.
https://drive.google.com/openid=1cdIodi9zIfReP0M3sHl6GxfNeazkwyUH
там кейгены и инструкции к ним. виндовский антивирус ругается, поэтому, если боитесь, запускайте на виртуалке
>>А реакты хотят пользователи.
Но я не хочу реакт, мне вообще этот современный дизайн для планшетов на ПК не нравится (огромные буквы и неинформативные картинки с кучей эффектов и тормозов). Мне уровня фейсбука вполне достаточно. Реакт хочет заказчик, а пользователь жрет что дают.
мимо дед-пользователь
Но ведь реакт вообще не про дизайн, он только про иерархию компонентов, внешний вид которых может быть любым.
Т.е. у нас событие govno длящееся 40 минут, 20 из них попало на 1 смену, 20 на вторую, нужно сделать два события govno, в обе смены, с нужной длительностью.
Временные смены фиксированы( положим с 9 до 9), есть даже вторая таблица, где хранятся все смены(но к ней нет прямой привязки, но можно заджоинится по ДатаВремя).
Как выглядит табличка-справочник со сменами?
Что ты хочеш написать? Select, который будет генерировать новые строки на основе твоего условия, или Insert, который прямо во время события будет укалдывать в твою табличку 1 (или 2) строчки?
Да, номер смены не ИД, а просто 1 или 2.
"MongoError: Topology is closed, please connect"?
Наивно. Сюда в основном заходят, чтобы спросить, как прямо сейчас решить какую-то конкретную задачу и, получив ответ, уходят. Никаких обсуждений, ничего интересного :(
Я вот почему спросил, нужно выбрать что то на проект с апишкой, тяжеловесный постгре или мускулю
>Я вот почему спросил, нужно выбрать что то на проект с апишкой, тяжеловесный постгре или мускулю
Террадата/hive
Есть, например, таблица материалов. Для получения каждой единицы материала надо сколько-то компонентов. Причём основываясь на количестве компонентов, затраты должны считаться автоматически.
Как это лучше организовать с точки зрения БД?
Вынести количество и затраты в отдельную таблицу?
Держи.
t_event - табличка с событиями, в ней start_date - датавремя начала, end_date - датавремя окончания
d_work_shift - табличка со сменами, в ней start_date - датавремя начала, end_date - датавремя окончания
Select
e.event_id
,s.work_shift_id
,iif(e.start_date >= s.start_date, e.start_date, s.start_date) as start_date
,iif(e.end_date >= s.end_date, e.end_date, s.end_date) as end_date
from t_event e
inner join d_work_shift s on
(e.start_date >= s.start_date and e.start_date < s.end_date) or (e.end_date >= s.start_date and e.end_date < s.end_date)
Я тоже пробовал что-то вроде этого.Конкретно в этом варианте:
1) Не добавляют строку, а просто меняет время начала-конца
2) Вместо того чтобы резать просто подставляет Время смены на которою заходит верхняя граница( При том не высчитаное, а просто начало-конец)
Например:
Мы полагали что смена идёт с 9 до 21, и выходит:
Старая запись
8.15-9.15
Новая Запись(которую вернул запрос)
9,00-21,00
Ну с датами в iif наверное что-то нахуеверчено, щас почекаю, а вот что он не режет, это уже проблема.
а нет погоди, таки режет, просто iif втором местами поменяны были e.end_date, s.end_date, и я неправильно счтал datediff. Спасибо аноныч.
А что будет если событие скажем длинной в неделю? Отдельную обработку для него делать?
Я так понял материал А изготавливается из материала B, который в свою очередь из материалов C и D?
Тогда иерархическая таблица типа
matrial | quantity | parent_id | purchased
parent_id - ссылка на запись в той же таблице на материал, который изготавливается из этого материала
purchased - булевы флажок, показывает, что материал "нижнего уровня", не из чего не изготавливается, а покупается
Делаешь рекурсивный запрос, сначала выбираешь "верхние", материалы, у которых нет paent_id, к ним юнионишь те, у которых parent_id - это айди первой итерации, из всего, что получилось делаешь select sum(quantity) ... grop by material where purchase=true
То есть если хуёвина А изготавливается из шести хуёвин B, а та - из трёх хуёвин С и двух хуёвин D,
Как-то так.
Но всё-таки уточнение:
есть объект А, для его изготовления нужен: объект B в количестве, например, 2 штук, объект C в количестве 3 кг и объект D в количестве 5 литров. Причём стоимость 1 штуки B, 1кг C и 1 л D вынесена в отдельную "справочную" таблицу.
Надо: организовать всё это во взаимосвязанные таблицы и подсчитать затраты на А, причём, желательно, сразу, основываясь на данных "справочной" таблицы.
Т.е. B, C, D - компоненты A, надо ли эти компоненты все в один столбик забивать? Или каждому - отдельный столбец? Их же очень много может быть. А что насчёт количества компонентов? Их вместе с названием писать типа B - 2 шт. или тоже вынести в отдельную таблицу?
такая
3testRegistration215 766
1test1200
6user300
Двачую, сикуэль это как на ангельском просто писать в правильном порядке ВЫБРАТЬ хуйню ИЗ таблиц ПРИСОЕДИНЕННЫХ к другим таблицам ГДЕ ... ГРУППИРОВАТЬ ПО. Все максимально логично.
Для формирования договоров на платные услуги, доп. соглашений с пациентами, штатного расписания и графика отпусков нужно хранить реквизиты поликлиники (в договоре и соглашениях используются всякие номера и счета, в расписании и графике - наименование организации). Я не понимаю, куда и к чему таблицу с реквизитами присобачить. Накидал по-быстрому схему. Где и какой внешний ключ создавать? К "ДопСоглашению" привязывать? А то, что атрибут "Наименование организации" потом в штатном расписании и графике отпусков используется, ничего?
Бля не, нет косяка.
И нахуя здесь бд нужно?
Одно время тоже об этом думал.
В итоге пришел к выводу, что удобнее хранить формулу текстом и парсить уже в приложении ее.
А что должно быть?
>Пытаемся понять, зачем нужен Тырпрайс, если есть бесплатный опенсурс
чтобы было, на кого можно подать в суд
Да я уже разобрался.
вообще их много можно поискать по запросу ER diagram generator/creator
https://editor.ponyorm.com/user/pony/pycon2014/designer
Вообщем есть человек и у него может быть множество различных транспортных средств. Например автомобиль, велосипед, танк, самолет и прочее. Для каждого из транспортных средств своя таблица. Таких таблиц может быть в принципе неограниченное количество. У человека каждого трансп средва может и не быть, каких-то может быть овер9000 и тд.
Вопрос. Как правильно организовать получение всех трансп. средств минимальными затратами, дабы каждый раз не делать селекты из каждой таблицы?
БД postgresql. Пробовал вариант с наследованием, но когда делаешь селект из базовой таблицы (например трансп. средство) то он возвращает данные из всех таблиц, но уникальные столбцы каждой таблицы соответственно не выводятся и плюс родительская таблица всегда получается пустой.
Единственный вариант который вижу - добавить таблицу, в который будут храниться типы трансп. средств которые есть у человека и соответственно делать селект из нее, а потом уже программно обходить только нужные таблицы. Но этот вариант очень ущербный в плане проверки целостности при каждом добвлении / удалении новой записи в любую из таблиц.
Промежуточная таблица, посмотри на примере адвенчур воркс ордер и ордер детаил.
на фейсбуке ux/ui так себе кста, даже блят не читаемо, если сравнивать с вк, 2 млрд пользователей с вытеканием глаз
слинковал сервис из /etc/sv/postgres/ в /var/service
выполнил sudo -u postgres -i
пердолю initdb --pgdata=/var/lib/pgsql/data
и выдает creating directory /var/lib/pgsql/data ... initdb: could not create directory "/var/lib/pgsql": Permission denied
есть дока не помогает как мне заставить все ето заработать
То есть поставил, врубил сервис, ща создаю кластер баз даных в виде директории где все будет хранится? Но он арет про разрешения
sudo !!
У меня в бд есть таблица с записями типа:
https://pastebin.com/raw/bYrcijf2
И записей в таблице до пизды более 20тыс.строк, так, вот, как вы можете видеть, в столбце dates хранятся даты в виде json массива, в котором бывает до 30 элементов, и чтобы найти записи с определенной датой, я выполняю запрос с dates like "%DD.MM.YYYY%".
Мне это видится лютым колхозом, и собсна, реквестирую способы перестроить бд чтобы от данного непотребства избавиться.
Единственный вариант, что я вижу, создавать для каждой даты отдельную строку, но мне кажется, что тогда очень сильно возрастет объем, занимаемый бд.
продолжение:
те кто писал sudo (dosu desu) был прав отчасти я пробовал sudo и su, зашел через sudo -u postgres -i
как я понял мне надо сначала поднять базу данных на локалхосте, создал тестовую db через createdb
Нужно ли редачить конфиг? pg_hba.conf и postgresql.conf
как например тут это описано https://stackoverflow.com/a/38466547/6757388
хуле это не описано в доке
я думал поставил пакеты и все блят, через pgadmin4 заходишь и создаешь нужные бд
Ну так вот вопрос че делать дальше, пробовал через psql и просто localhost писать
> Единственный вариант, что я вижу, создавать для каждой даты отдельную строку
Да.
> тогда очень сильно возрастет объем, занимаемый бд
200к строчек это ни о чем, так что поэтому поводу можешь не переживать.
По сути ты тут выбираешь между скоростью запроса и объемом бд. Если первое тебя не беспокоит, то ничего не делай.
Понял, спасибо
>создавать для каждой даты отдельную строку
Зато повысится уровень нормализации и ты сможешь делать нормальные фильтры, джойны и так далее.
Второй вариант, хранить и работать с ними не как со строкой, а как с типом jsonb[], для работы с которым есть нормальные функции, а не поиск лайками.
>jsonb[]
Резонно, но мне показалось, что поиск по одной строке будет быстрее чем по массиву со строками. Проведу пару тестов
Вопрос в том, как ты потом собираешься жить, храня данные в таком бесструктурном виде.
Возвращает -1, если govno - null.
>>на фейсбуке ux/ui так себе кста, если сравнивать с вк
Чет я зря про фейсбук написал, последний раз когда на него заходил - он от вк не отличался.
подключился к локальной базе данных в pgadmin4 только через 192.168.0.10, после того как увидел через ss -noa, чому так? Я же настроил в конфиге через локалхости и любой айпи
Есть база, в базе меня интересуют три таблицы, две идентичные, третья связана с ними, одна запись третей таблицы связана только с одной записью в одной из таблиц. Нужно получить результирующую таблицу со всеми полями из этих таблиц + пару дополнительных полей, заполняемых в зависимости от значений в полях изначальных таблиц.
Поначалу понятно, хуярим два иннер джоина, потом юнион результатов. А вот как добавить поля и заполнить их я хз. Сами методы для дерганья данных я знаю, но как написать код добавляющий и заполняющий эти поля я не очень осознаю. Тупо какими-то циклами или можно к джоинам как-то прикрутить, шоб изящно было?
Мимонубас
Можно прямо в выражении определить "вычисляемую таблицу" и сделать джоин с ней. Это зависит от конкретной СУБД, в оракле будет типа такого:
(select 1 as "a", 2 as "b" from dial union select 3, 4 from dual)
Не совсем осознал, можешь привести пример более наглядный, с табличкой мб какой?
Например, вот.
-- Создаём и заполняем таблицу:
create table mytable (id integer not null);
insert into mytable (id) values (1);
insert into mytable (id) values (2);
-- в скобках - table expression, джойним его с mytable
with t as (
select 1 as mytable_id, 'foo' as val from dual
union
select 2 as mytable_id, 'bar' as val from dual
)
select * from mytable
inner join t on (mytable.id = t.mytable_id);
Или тебе не данные нужны, а прям новую таблицу создать? Тогда да, смотреть в словаре данных, какие в тех таблицах колонки, и вручную через циклы их добавлять в новую таблицу.
Есть результат запроса с полями
id1, id2, id3
Если id1 и id2 в двух строках меняются местами (вроде 1 10 5 и 10 1 5), то это гарантированно дубликаты.
Можно ли как-то их выпилить? Думал васянскую хэш-функцию запилить, но она не гарантирует корректной работы, с груп баем тоже ничего придумать не могу.
А все, сам понял, id1 и id 2 же неодинаковые, можно просто id2 > id1 выбрать.
Ух ты, спасибо.
Застрял на задании по вложенным запросам --Получить спецификацию монитора, имеющегося в наличии на складе, цена которого минимальна*.
Не могу понять что не так и как вывести нужный результат.
Может кто нибудь подсказать в чем ошибка что не так ?
Есть таблица users на 60+ колонок, 50 из которых могут изменяться со временем. Моя задача создать новую запись если старая изменилась в любой колонке НЕ удаляя старую, то есть UPDATE не подойдет.
Типы значений разные. Мое текущее решение огромное и с кучей повторения которое невозможно нормально отлаживать.
пытался плейсхолдерами пофиксить, лучше не стало
INSERT INTO users(col_1, col_2, col_3,...col_50)
SELECT %[1]v, %[2]v, %[3]v, .... %[50]v
WHERE NOT EXISTS(SELECT (col_1, col_2, col_3,...col_50) FROM users WHERE col_1=%[1]v, col_2=%[2]v, col_3=%[3]v, ...col_50=%[50]v);
Если колонок было до 5 еще ладно, но когда их много это решение совершенно не годится
Спасибо большое, это то что нужно и даже лучше, хоть и с реализацей пока не полностью разобрался в силу малого опыта
собственно проблема на пикриле , как фиксить?
изменить название колонки не вариант, база не моя
Можно сложный, можно на английском. Часов на 5-20.
можно было просто вот так неуч
Вот так и пиши “to” и “from”
Возьми в кавычки: `to`
personinfodb.db::memory: и есть имя бд (неважно сколько там : перед memory, в любых вариациях ошибка.)
Все здорово, разобрался с типами scd, хэш функциями для колонок, написал свои триггеры, создал служебные таблицы, теперь все клево и быстро
Мне вообще нужна относительно легковесная штука с автокомплитом под postgres на линукс, pgadmin со своим апачем раз в месяц стабильно отваливается, надоело уже.
а разве нужно ставить имя для базы в памяти? пробуй просто :memory: и или ты там хочешь несколько баз
Я хочу написать дбшку как файл, после этого когда буду делать коннекшон просто поставить дбшку, а не писать руками опять. Но я вроде бы нашел, что проблема в какой-то мелкой запятой, которую я не могу найти
Делаю так
Select chop,product,(SUM(sale)/(select sum(sale)from t1))*100
From t1
Order by chop,product
все отбой
Чтоб оно автоматически резало на секции, какой примерный алгоритм?
IDEA
Что то нихуя оно не выбирает
Aqua data studio
WITH Govno
AS
SELECT COUNT(Товар)
FROM Фрукты
GROUP BY Группа
SELECT Товар
WHERE Товар in
(
SELECT *
FROM GOVNO
WHERE GOVNO>1
)
А бля, Aкелла промахнулся, вот так:
WITH Govno
AS
SELECT COUNT(Товар) AS Duble
FROM Фрукты
GROUP BY Группа
SELECT Товар
WHERE Товар in
(
SELECT Duble
FROM GOVNO
WHERE Duble>1
)
ааа бляяять да идите нахуй короче
SELECT Товар, Группа
FROM Фрукты
WHERE Товар in
(
SELECT Товар
FROM Фрукты
GROUP BY Группа
HAVING COUNT(Товар)>1
)
Хз, вроде все верно, покажи что возвращает. Все вместе и отдельно подзапрос.
Здарова, аноны.
У меня есть БД "студенты сдают проект".
Основные сущности на пикрилейтед. Только вопрос вот в чём. У меня по ТЗ препод (teacher) может быть и руководителем (curator) проекта, и проверяющим (comission_member). Как рациональнее всего сделать разделение учителей на кураторов и участников комиссии? Обяз ли для этого создавать подсущности, которые будут хранить только айди? Хелп
Кураторы хранятся в Project, а комиссия выставляет оценки через project mark. У них разные обязанности
На каждый проект по 3-5 челов из комиссии ставят оценку проекту, которая хранится в project mark
Тебе нужно две таблицы:
-ФИО прподователя - ИД
-Роль(куратор\мембер\оба) - ИД
И из них уже собирай по ключам.
Есть 3 таблицы:
Customer: id, name, lastname;
Product: id, label, price;
Customer_Product: customer_id, product_id, date;
Запрос: Поиск покупателей, купивших меньше всего товаров.
У меня получается только так:
SELECT c.name, c.lastname FROM customer c INNER JOIN customer_product cp ON cp.customer_id = c.id GROUP BY c.name, c.lastname HAVING COUNT(cp.product_id) < 2 limit 3;
Во что вставить вместо двойки, не пойму... Или вообще запрос не так делаю?
>>635954
Все заработало, спасибо =)
declare @t table ( id int, tovar varchar(250), grup varchar(250) )
insert into @t
values (1, 'яблоки', 'Фрукты'), (2, 'яблоки', 'Овощи'), (3, 'яблоки', 'Автозапчасти'),
(4, 'яблоки', 'Шлакоблоки'), (5, 'Говно', 'Говнище'), (6, 'Груши', 'Фрукты')
, (7, 'Груши', 'Овощи'), (8, 'Груши', 'Автозапчасти'), (9, 'Груши', 'Шлакоблоки'),
(10, 'яблоки', 'Автозапчасти'),(11, 'яблоки', 'Автозапчасти'),(12, 'яблоки', 'Автозапчасти');
SELECT tovar, grup
FROM @t
WHERE tovar in
(
SELECT tovar
FROM @t
GROUP BY tovar
HAVING COUNT(*)>1
)
group by tovar,grup
как с камнями?
Юзай min()
Может кто-нибудь рассказать свою историю успеха и кто как вообще учился этому ремеслу?
(3 курс-кун)
Наверное
Селект доля продаж товара с НДС фром таблица
Гроуп бай дисенд
Если каждое дно, магазин, товар в отдельной строчке, если нет, отсортировать по параметру, который выведет отдельно каждый из необходимых и добавить дисенд, дабы это было в убывающем порядке
Да, если постов больше определённого числа, называемого бамплимитом (здесь 500), тред перестаёт подниматься и начинает "тонуть".
Благодарю за разъяснение
Разве не 1000?
Инфу для вкатывания, быстра!
В 20 лет, пару месяцев заняло изучение. Ничего сложного особо нет, вся логика - суть операции над дискретными множествами и их подмножествами. И то не проный набор помоему.
То есть что нельзя пропустить нормальную здоровую строчку без NULL'ов, используя INNER JOIN?
Например, в бд лежат ключи со значениями в виде словарей, и мне надо выбрать все ключи, у которых одно из полей словаря равно нужному мне значению
Хотя есть одно но, если я уберу галки "каскадное обновление связанных полей", и "каскадное удаление связанных полей", оставив только "обеспечение целостности данных", то получается создать связь, но мне те галки нужны. Что делать?
выдать учкетку ему с ограниченными правами.
Или вариант для супермозга, создать вторую базу и настроить dblink между, а чтоб избавиться от @блабла.бла синонимо нахуярить
А если всерьез то я не понял вопроса
outer - full, пустые могут что слева быть что справа
inner - left, right, просто джойн. слова иннер аутер опускаются из-за ненадобности
в универе научился писать селект из одной таблицы.
учить в 23 начал, за 3 месяца ежедневного обучения я знал процентов 80% из того что пишут взрослые дяди.
ну а там на их примере научился дальше.
3 год работаю ораклистом. полет нормальный
sql-ex.ru
>outer - full, пустые могут что слева быть что справа
>inner - left, right, просто джойн.
Мало того, что ты отвечаешь не на заданный вопрос, так еще и хуйню несешь полнейшую.
по факту ты хочешь создать внешний ключ на таблицу.
одна из таблиц должна быть справочником иметь уникальный столбец. т.е. первичный ключ.
Вторая же должна на этот столбец ссылаться
т.е. на нем строит параметр уникальности(первичный ключ)
INNER JOIN это аналог JOIN
LEFT OUTER JOIN это аналог LEFT JOIN
RIGHT OUTER JOIN это аналог RIGHT JOIN
FULL OUTER JOIN это аналог FULL JOIN
Просто OUTER не бывает
Еще бывает CROSS JOIN
Еще бывает NATURAL JOIN (не нужно это использовать)
>поясни за хуйню
>inner - left, right, просто джойн.
Вот хуйня. Inner это просто inner, безо всяких left и right.
Вопрос был про то, возможно ли теоретически упустить какую-то строчку, пользуясь INNER JOIN (а не OUTER'ами), если строчки с NULL'ами не нужны. Или же все, что добавляет тот или иной OUTER JOIN по сравнению с INNER'ом на тех же данных, обязательно содержит NULL.
сори-сори перепутал, оправдываться не буду
Можно ли ввести разработку базы в контроле версий?
Хранить "CREATE TABLE USERS" в Git-е и накатывать разные версии без потери данных в той самой таблице?
У пользователя на компе устанавливается сервер MySQL (который из zip архива, а не инсталлером устанавливается, если эта информация важна, а то я не силен в этих ваших бд), на этом сервере я создаю бд с которой в дальнейшем будет работать некоторая программа. Так вот, задача заключается в том, чтобы не дать пользователю добраться до этой бд. Вот, например, пользователь может запустить сервер с параметром --skip-grant-tables и в дальнейшем сбросить пароль на root'е. Как ему можно ограничить этот функционал?
Никак, если пользователь Админ.
Не надо на компе у пользователя устанавливать СУБД, чтобы он в ней работал, для этого используют сервер.
Можно, напиши скрипт, который будет превращать табличку в Json, например, и скрипт, который будет из Json инсертить данные в таблицу, с учетом identity_insert, конечно.
Можно вместо json-а написать генерилку запроса, чтобы из таблички генерился запрос, типа
merge d_user as t
using (
select 1, 'LOX'
union all select 2,'PIDR'
) as s ...
который бы мерджил данные с продашном
Понял, спасибо.
Стек - sql server,teradata
Ну и SSIS,Pentaho и прочая залупа
Игогда переписываю или пишу процедуры и прочую хуету
Куда двигаться дальше - хз
Как выбраться из говна, пойти в HADOOP и начать учить Джаву...
Аналогичная история была.
Уволился с последней такой работы, тока 200к платили.
Заебало говна разгребать.
Решил, что уволюись, выучу всякие там Angular для фуллстака в дополнение к шарпу, потом бигдату.
В итоге, месяц я ни хуя не делал, на второй месяц ко мне обратился знакомый с позапозапршлой работы и подкинул заказ.
Потом еще заказ подкинули, и еще - все по связям с предыдущих мест. Я открыл ИП и стал работать на себя, получилось еще поднять доход, а, самое главное, теперь я сам себе хозяин, работаю из дома, сам говорю, сколько стою, в общем, куча профитов.
Проблема только в том, что я так ни хуя нового и не выучил почти, но я тут понял одно - либо учишься, либо зарабатываешь нормальные бабки тем, что умеешь. И решил я заработать хотя бы 10 лямов, чтобы их пустить в инвестиции, а потом уже жить в основном с доходов от ценных бумаг, а освободившееся от зказов время (не всех думаю дропнуть, но большинство) пускать уже на всё, что захочу, включая учебу, если смогу себя заставить, конечно.
Есть таблица вида
Имя | Поле1 | Поле2 | Поле3 | ID
В таблице есть одинаковые строки с разными ИД. Скажем есть ИД 2 и ИД 3, в рамках этих ИД есть одинаковые строки отличающиеся только ИД, так же есть много других строк\ид, которые не повторяются, пересечения только в рамках строк у которых ИД 2 и 3.
Соотвественно мне нужны строки с ИД 2, которых нет в ИД 3. Вроде как просто решается подзапросом, но какой-то топорный метод, нельзя ли что-нибудь поизящней с OUTER JOIN прикрутить?
То есть убрать этот ключ во всех другиз таблицах и оставить в одной?
1)Каждая строка уникальна? Полные дубли есть?
2)ID уникален?
3)Что значит: "нет в Id3" ? Требуются строки с id2 и таким набором полей которого нет ни для одной строки с id3?
4) для других id могут быть аналогичные ситуации? Требуется ли фильтрация для них?
Нам скинули файл с БД какой-то, сказали открыть через VS, я открыл. По заданию нужно её заполнить чем-нибудь.
Я создал вот такую хуйню пик1.
Собсна вопросы:
1. Как сделать тут связи?
2. Как заполнить БД чем-нибудь?
>SELECT suka FROM blyad FROM ja=pidoras;
там сразу отображались? Пиздос, неужели настолько юзабилити не продумано в этом говне?
Ладно, блядь, с этим разобрался. Но как посмотреть, что SQL отвечает? А то я ебал глазами парсить эти километровые генерированные запросы и думать да гадать, с какого хуя по таким юзерам у меня инфа приходит, а по таким - пустота. Будь у них очко share-ключами обколото...
Д Р О П Н У Т Ь , К А Р Л ! ! !
НЕ МОЖЕТ, НЕ ПОТРАТИВ НА ПОЛНЕДЕЛИ МОЕЙ И БЕЗ ТОГО ВСРАТОЙ ЖИЗНИ-ТО НАХОЙ, А? А???? А БЛЯДЬ???!??!?!?!?!?!??!?!?!??!!
блядь, лог забыл выключить, чуть весь ссд-шник не забил к ебаной матери
Я решил сделать по-другому. Когда я меняю стоимость тарифа, я на самом деле не меняю тариф, а создаю новую версию этого тарифа, а к старой версии добавляю FK на новую. И когда у старого тарифа больше не остается подписчиков, он удаляется из базы.
Норм решение, какие подводные? Или может уже есть какие-то best practices для подобного?
есть огромный таблица лог вида:
userid | timestamp | actions
есть требование
userid | date_start | date_end
как из первой таблицы найти записи нужных юзеров в указанном для него периоде? (для всех юзеров периоды, с date_start по date_end разные)
Для себя делаю скрапер двача, возник резонный вопрос в чем хранить сообщения/треды. Пока что есть безотказный вариант для аутистов - просто json на диске.
Что нужно от БД - быстрая выборка всего треда по его id, хранение нескольких версий одного и того же поста в треде, в перспективее - полнотекстовый поиск по постам.
Соответственно, мало вставок и очень много выборок.
Господа DBA, подскажите что выбрать? В базы данных умею слабо, по работе с динамкой только работал.
Добрейший вечерочек, господа апельсинусы. Делаю учебную хуйню про архитектурную организацию, сотворил модель данных.
Прогер во мне умер уже пару лет назад, память отлетела внахуй, но делать приходится. С инструментами разработки, можно сказать, уже не знаком, с тем, как подлезть к началу собственно реализации, тоже. Подскажите, чем делать БД и на чем быстро/удобно можно быстро намутить приложение для работы с этой самой БД?
Понятно, что тестовое я завалю просто интересно
Алсо, эта хуета явно недоиспользует ресурс (RAM, CPU) моей пекарни, чтоб грузиться быстрее, блядь. Я не верю, что все в SSD упирается, там ведь гигабайт с небольшим всего, а грузится оно минут десять.
я тут хотела поинтересоваться, можно ли как-то увидеть удаленные из диалога (загруженные туда же) видео? поискала, в тырнетах пишут, что нужна прямая ссылка. как ее получить если само видео указывается пустым сообщением?
еще такая фишка, что если живешь в евросоюзе, они тебе обязаны предоставить при запросе группы, в которых ты админил и период, удаленные фотки и видео, голосовые и тд. можно ли это как-то наебать, или попросить кого-то из евросоюза с моей страницы вк запросить эти данные?
или, может, есть какие-то сайты, где какие-то уполномоченные люди сие замечательной социальной сети могли бы за отдельную денюжку предоставить эту инфу? кто знает?
Нахуй ты это спрашиваешь в теме по базам данных, дура?
Узнал чтота же Postgres связывается с приложениями через сокеты (как правило порт 5432), есть ли люди которые ставят эту БД на удаленном сервере, а не на localhost? В принципе так можно делать, но ебучие HTTP-запросы ведь идут пиздец как долго. Есть ли резон так делать?
Если для тебя критично, что запросы из бд идут "пиздец как долго", то скорее всего проблема в твоей архитектуре.
Я не ванга и не знаю, что ты там делаешь, но можешь попробовать к своему приложению какой-нибудь кэш прикрутить, или типа того.
Вообще, в индустрии все давно на микросервисах с HTTP, и ничего, как-то живут люди.
Хотя, если тебе бд нужна как внутреннее хранилище данных приложения, то вместо Postgres возьми идущую в качестве батареек к питону sqlite3
Бля, спасибо, отдуши. Класс, сам в этом направлении двигаться и начал.
>>1000000
>>1111111
>>1234567
Охуенные вводные, братан.
Во первых, какой тип данных имеет timestamp? date? time? datetime? datetime2?
Во вторых, каким образом ты собрался разбивать дату СОБЫТИЯ на НАЧАЛО и КОНЕЦ, если СОБЫТИЕ привязывается к определенной отметке во времени, а не к периоду?
Я, конечно, добоеб и может чего не знаю, но тебе нужно будет писать отдельный запрос под каждого юзера при помощи UNION
Можешь подсказать по хардкору:
Хочу сделать бота с кусрами в образовательных целях, но хочу сделать все максимально правильно.
Короче, какие БД для деревьев лучше подходят SQL или NoSQL?
Я подумал, что курсы лекции это вложенные структуры данных.
Т.е. документ это лист. Последняя структура данных в дереве. Но есть составные ветви типа "курс залупа ерохи"->"лекция 666"->"урок 1488"->"документы урока".
Но может быть и сразу "Курс залупа ерохи" -> "документы курса".
Вот я немного подустал думать какую же базу взять. SQL или NoSQL.
Очень просто.
Если ты хочешь организовать поиск, например, по названию курса или документа, то не стоит использовать обхектную БД.
Плюс почти все реляционки сейчас умеют в json, так что вообще особо не вижу проблем использоать mysql/postgres/ms sql.
там хотя бы структура понятная будет.
Наименование Сумма Начало Конец
-покупка1 300р 12:00 12:30
-покупка2 125р 13:05 13:20
Нужно разбирать по минутам, т.е.
Покупка1 длилась 30 минут, это по 10р минуту, т.е. одна строка должна превратиться в 30 строк по 10р.
Как это можно реализовать?
Хуя у тебя задачи всратые
Ну я понемногу на этом и начал сходиться. В общем с реляционной никаких проблем не будет. Спасибо.
По сути для всей вложенности нужно будет только две модели это "Ветвь" с указанием типа и parent'a и "Лист". Хотя если вдруг я захочу вложенность всего курса вывести потребуется большое количество джоинов.
Ну так построй рекрсивно поминутный набор дат и сджойни его со своей таблицей.
Другого варианта "размножить" строки за 2.5 года я так и не придумал.
Ну хз, мне не разово это делать, плюс там длительность может быть больше часа, не хранить же сутки в минутах . Пока рассматриваю вариант делать apply на цикл с while, но что-то выглядит как костыль, и по реализации есть ряд вопросов.
У меня есть Пользователь, у Пользователя есть Каталог (связь через кросс-таблицу, многие-ко-многим), в Каталоге валяется Ресурс (тоже связь многие-ко-многим через кросс-таблицу). У Ресурса есть колонка Алиас, которую пользователь устанавливает через бизнес-логику.
Как сделать так, чтобы Алиас был уникальным в разрезе Пользователя? Я только в unique index умею, но он не подходит, потому что два разных пользака могут задать одинаоковый алиас своему ресурсу и это нормально. Так что одинаковые значения могут быть в этом столбце.
Как быть? Можно какой-то справочник создать отдельный, типа Ид Пользователя - Ид Ресурса - Алиас этого Ресурса? Или какой индекс на несколько таблиц, но я хз как оно делается и можно ли это? Куда хоть копать, что гуглить?
CREATE TABLE a (url VARCHAR(255));
CREATE TABLE b (host VARCHAR(255));
В таблице А – url'ы:
http://2ch-ebach.hk/abc
https://google.com/?query=xxx
...
В таблице B – хосты:
zhopa.com
2ch-ebach.hk
yahoo.cn
...
Как построить DELETE запрос, которая удалит из А все строки, у которых есть подстрока из Б?
Что-то типа DELETE FROM a WHERE url LIKE '%'+(SELECT host FROM b)+'%', но чтобы было не плодом моей фантазии.
Сап, покажете пример решения? Всего заданий много, но мне хотя бы пример одного увидеть.
Я так понял "весят больше чем родитель" - это нужен подзапрос. Но как мне реализовать в запросе связь между животными и их родителями?
Составной ключ сделай. Модно вобще хэш вычислять и добавлять индкс. Либо в одной из таблиц генерацию делай не с 1(ну тут важно не обосраться потом)
Держи
SELECT name
FROM animals as child
WHERE weight>
(SELECT weight
FROM animals as parents
WHERE parents.parent_id=child.parent_id)
>>681371
В общем виде
DELETE FROM tableA
WHERE ROWID IN
( SELECT ROWID
FROM tableA b
WHERE УСЛОВИЕ(Тут можно селект к первой таблице
);
НО, если у тебя таблицы большие тебе придётся сравнивать урлы полнотекстовым поиском, а это пиздец. Как вариант сделать им INTERSECT и по нему уже делать удаление. Ну или если тебе нужно просто уникальные записи сделать EXСРТ ну тут хз как лучше, помоему это говно тоже весьма затратное по ресурсам
https://stepik.org/lesson/297515/step/7?unit=279275
Кто сдавал, чё посоветуете?
Даже больше тебе скажу, не может быть нескольких pk на одной таблице.
Можнт быть составной PK (из нескольки колонок)
Тихо, не пали контору, он особенный.
лол. ну дак оракл закешировала части запросов ну и выдает тебе их мгновенно.
ты бы сравнил лучше запросы разного характера исполняемые параллельно с разными данными.
Now you'll see why we needed groups: to look for specific values in a particular part of the DataFrame. We'll use our new function, but first we need to think of an argument. Let's group the DataFrame by the user_id column, so group_name will represent the user and the corresponding piece of data will be handled by the group_data variable. Now that we've decided what data to use as the argument, we can save it to genre_grouping .
Call the get_heavy_listener function and pass genre_grouping as its argument. Save the result in the user_id variable and print it. Note that the algorithm is not perfect: as soon as it finds a user with 50+ listens, it stops searching. But here we have at least one of our unknown music lovers! Аноны вообще не понимаю задания - помогите
А почему вдруг там красным что-то выделено? От relations.import_id аж 2 связи в citizens.import_id идут. С фига ли?
Анон, посоветуй годный курс по БД. Устраиваю себе интенсив перед завтрашним собесом. Ранее БД нюхал, на уровне join'ов, но даже их мне лучше повторить. Про индексы только слышал.
https://www.udemy.com/course/sql-oracle-certification/
я сейчас этот смотрю, есть на торрентах.
Только надо смотреть на скорости х2, а то разговаривает ну уж очень медленно.
Секрет, вдруг ты меня завтра будешь собеседовать и такой - "ага, знаю я тебя, двощер, пиздец тебе"
Спасибо, анонче, сейчас буду искать.
Допустим я хочу сделать order by по этому столбцу. Насколько дольше будет выполняться запрос с order by чем без него? Это вообще существенная величина или нет?
Существенно дольше. Есди есть индекс, то тнет.
Вы видите копию треда, сохраненную 22 мая 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.