• Получить max() от результатов sub-query?

    Можно вот так попробовать:
    with jackpot as
    (
    SELECT (SELECT Coalesce(Max(won_amount), 0)
            FROM   `fast_games`
                   INNER JOIN `fast_bets` AS `winning_fast_bets`
                           ON `winning_fast_bets`.`id` =
                              `fast_games`.`winning_bet_id`
            WHERE  users.id = winning_fast_bets.user_id
                   AND `fast_games`.`state` = ?)
           AS `max_fast_jackpot`,
           (SELECT Coalesce(Max(won_amount), 0)
            FROM   `coinflip_games`
                   INNER JOIN `coinflip_bets` AS `winning_coinflip_bets`
                           ON `winning_coinflip_bets`.`id` =
                              `coinflip_games`.`winning_bet_id`
            WHERE  users.id = winning_coinflip_bets.user_id
                   AND `coinflip_games`.`state` = ?)
           AS `max_coinflip_jackpot`  ),
           id as user_id
    FROM   `users`
    WHERE  `id` = ?
    )
    select case when `max_fast_jackpot` > `max_coinflip_jackpot` then `max_fast_jackpot` else `max_coinflip_jackpot` end,
      from jackpot
      inner join ..... as foo
                  on  foo.id = jackpot.user_id
     where ....


    Т.е. часть запроса, которая начитывает max_fast_jackpot и max_coinflip_jackpot вынести во временный запрос и уже его джойнить к оставшемуся запросу через user_id. При таком варианте не нужно будет повторять расчет полей max_fast_jackpot и max_coinflip_jackpot несколько раз.
  • Проверить существует ли запись в другой таблице?

    Нужно немного допилить запрос, вот так:
    select art.*, CASE WHEN sbr.artist_name IS NULL THEN 'FALSE' ELSE 'TRUE' END
      from artists as art
      left join subscriptions as sbr
             on sbr.artist_name = art.name
            and sbr.user_name   = 'objque@me'
     where art.name like '%skrill%'


    В предыдущем из-за того, что проверка user_name = 'objque@me' была в секции where, join не смотря на то что написано left исполнялся как inner
  • Поиск по базе в которой более 10 млн строк?

    Тут есть нюанс: нужно учитывать размер текстового поля.
    Если текстовое поле будет например char(200), то строить но нему индекс будет плохой идеей.
    Вроде из названия поля следует, что first_name - это просто имя и оно не должно быть большим, но все же нужно проверить так это или нет.
  • Как с помощью SQL вывести запрос с 2 inner join?

    При группировке в секции select должны быть либо поля по которым выполняется группировка, либо константы, либо агрегирующие функции. В данном запросе нет группировки по полям inf_courses.name, inf_statuses.name - при выполнении запроса будет ошибка.

    Нужно тогда и эти поля включить в группировку:
    GROUP BY act_courses.course_id, act_courses.status_id, inf_courses.name, inf_statuses.name
  • Как подобрать кривую преследования заданной формы?

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

    В таком случае просто кривая разбивается на участи каждый из которых условно содержит 4 точки и описывается отрезком сплайн-кривой. А чтобы такая цепочка кривых выглядела гладко накладывают дополнительные условия на равенство первых производных (касательных) на границах двух отрезков, т.е. например в конечной точке текущей кривой и начальной точке следующей.

    Некоторую теорию можно тут посмотреть :
    statistica.ru/branches-maths/interpolyatsiya-splay...
    и тут:
    https://habr.com/post/264191/

    И вот эта pdf-ка с описанием не плохая.
    www.bmstu.ru/ps/~azaharov/fileman/download/%D0%93%...
  • Как создать временный файл и работать с ним в Python?

    Mr.nobody, Можно сохранить ранее сформированный путь к временному каталогу

    import tempfile

    directory_name = tempfile.mkdtemp()
    tempfile.tempdir = directory_name

    И далее уже как вы раньше делали, искать файл

    storage_path = os.path.join(tempfile.gettempdir(), 'storage.data')
    with open(storage_path, mode='w', encoding='utf8') as file:
  • Как создать временный файл и работать с ним в Python?

    Mr.nobody, можно так попробовать:

    directory_name = tempfile.mkdtemp()
    storage_path = os.path.join(directory_name, 'storage.data')
    with open('storage_path', mode='w', encoding='utf8') as file:

    В описании tempfile.gettempdir() указано что ее результат зависит от платформы и настроек, может в вашем случае
    не настроено директории для временных файлов.
  • Запрос delete не выполняется, хотя тот же запрос select-а выполняется можете помочь почему?

    alpa_kz, В MSSQL при такой ошибке срабатывал такой трюк:
    DELETE mdate
       FROM mdate mdate
      WHERE EXISTS(SELECT 1
                     FROM mdate bfr
                    WHERE bfr._user_id     = mdate._user_id
                      AND bfr.message_date > mdate.message_date)
  • Как составить SQL запрос на выборку из двух таблиц по условию?

    Артём Каретников, все как раз наоборот count(1) не делает лишних заходов в таблицу в отличие от count(*). А top 1 вообще не решает задачу, т.к. может быть несколько пользователей с одинаковым количеством, а top 1 вернёт только первого. Насчёт индексов вообще спорно. В данном случае внутренний и внешний дата сеты могут быть соединены hash join, а это быстрее чем искать по индексу, т.к. поиск по индексу имеет сложность O(log(n)), а поиск по хеш-таблице O(1). Т.е.поиск по хешу не зависит от объема выборки, а поиск по индексу сильно зависит. Кроме этого поиск по индексу требует больше обращений к диску, если индекс не закеширован в памяти, а дисковые операции очень дорогие.
    Вот так как-то. Но если не верите проведите эксперимент, сделайте оба варианта запроса и сравните их планы.
  • Как получить список чисел отсутвующих в базе PostgreSQL?

    Melkij, tempdb в MSSQL, но смысл тот же, либо запрос в оперативке обрабатывается, либо дисковые операции.

    SSD vs RAM, тут от конкретных продуктов зависит, но да тут 1-2 порядка разница в пользу RAM, но уже не 5 порядков как с HDD
  • Как получить список чисел отсутвующих в базе PostgreSQL?

    Melkij, это может быть следствием того, что база тестовая и есть много свободной оперативки для построения хэш таблицы.
    Есть ли индекс по полю id и если есть то какого типа (уникальный, кластерный)?
  • Как получить список чисел отсутвующих в базе PostgreSQL?

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

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

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

    3. в случае хэш джойн получим доп. накладные расходы на постороение хэш таблицы и на вычисление хэша для каждой записи внешней таблицы. Но есть плюс, т.к. вложенный датасет храниться в оперативке, то операции с ним выполняются быстрее чем с диском (хотя если диск SSD то разница не сильно большая).

    Вариант с not exist при наличии индекса:

    1. Тут возможна ситуация, что весь индекс или большая его часть закешированы в оперативке и тогда не будет множественных обращений к диску. А поиск в памяти по бинарному дереву (по индексу) может быть быстрее чем по хэш таблице, если учесть время необходимое для вычисления хэша от каждой записи внешней таблицы и на построение хэш таблицы.

    2. Если индекс не закеширован то да, на поиск и загрузку страниц индекса с диска требуется больше времени чем поиск в хэш таблице в оперативке.
  • Как получить список чисел отсутвующих в базе PostgreSQL?

    longclaps, Melkij, в данном случае not exists должен быть быстрее чем NOT IN.

    Тут фишка в том что при NOT IN нужно построить два датасета и заджойнить их, при этом по вложенному датасету в этом случае нет индекса и поиск будет долгим (возможно сервер сам примет решение сделать какой-нибудь hash join, но все равно это будут накладные расходы на построение хэш таблицы)

    Если использовать not exists и по полю id вложенной таблицы есть индекс, то вложенный подзапрос быстро отработает используя индекс для определения наличия id.(судя по описанию id это ключевое поле и индекс должен быть.)
  • Как правильно построить запрос из трех таблиц?

    Albert Kazan, вы правы. Но этот запрос простой как гвоздь.
    Вот как-то так:

    select t1.[id заказа], sum(t2.[Стоимость]) as total_price
      from СвязьТоваровЗаказов as t1
      inner join Товары as t2
                 on t2.[id] = t1.[id товара]
     group by t1.[id заказа]
  • Как правильно построить запрос из трех таблиц?

    Albert Kazan, тут есть нюанс. Если со временем у вас поменяется стоимость какого-то товара, то суммы всех заказов в которых есть этот товар изменятся, а значит и отчетность за прошлые периоды изменится. Но ведь по факту деньги за заказ заплатили фиксированные и стоимость уже оплаченного заказа меняться не должна. А ещё бывают всякие временные скидки и промокоды, которые не влияют на стоимость товара, но могут влиять на стоимость заказа. По хорошему после того как заказ сформирован общую сумму лучше хранить в заказе. И ещё для учета скидок и промокодов возможно потребуется добавить поле сумма в таблицу связи товаров и заказов. Т.к. например стоимость некоторых товаром может меняться от того сколько вы этих товаров (я имею ввиду количество) включили в заказ.
  • Как ускорить код с подсчетом похожести?

    Теоретически можно ещё запустить сравнение в несколько потоков.
  • Как правильно написать SQL запрос с использованием переменной?

    WebAnalytics1, странно все это, но вот если в вашем запросе правильно расставить алиасы у полей, то все работает, я вот такой запрос проверял:

    DECLARE @today as Date, @yesterday as Date;
    Set @today = convert(date, getdate());
    Set @yesterday = convert(date, dateadd(day, -1, getdate()));
    
    SELECT m.Name, o.Created,
    Count(DISTINCT(CASE WHEN Status =  'N' And  o.Date = @today Then i.ID END))  as NewQ,
    Count(DISTINCT(CASE WHEN Status =  'N' And  o.Date = @yesterday Then i.ID END))  as YdNewQ,
    Count(DISTINCT(CASE WHEN Status =  'W' And  o.Date = @today Then i.ID END)) as WaitingQ,
    Count(DISTINCT(CASE WHEN Status =  'W' And  o.Date = @yesterday Then i.ID END)) as YDWaitingQ,
    Count(DISTINCT(CASE WHEN Status =  'U' And  o.Date = @today Then i.ID END))  as ProblemQ,
    Count(DISTINCT(CASE WHEN Status =  'U' And  o.Date = @yesterday Then i.ID END))  as YdProblemQ,
    Count(DISTINCT(CASE WHEN Status =  'Z' And  o.Date = @today Then i.ID END))  as CancelledQ,
    Count(DISTINCT(CASE WHEN Status =  'Z' And  o.Date = @yesterday Then i.ID END))  as YdCancelledQ
    
    FROM Orders i 
    LEFT JOIN OrderItems o ON o.OrderID = i.ID
    LEFT JOIN NomenclUS m ON m.ID = o.ProductID
    
    WHERE i.Status <> 'Z' AND o.Created >= dateadd(day, -2, getdate())
    
    GROUP BY o.Created, m.CatID, m.CatName,m.Name
    ORDER BY o.Created, m.CatID


    Для эксперимента вот такие таблицы создал:
    create table Orders (ID int, Status varchar(1))
    go
    create table OrderItems (Created datetime, Date datetime, OrderID int, ProductID int)
    go
    create table NomenclUS(ID int, CatID int, CatName varchar(20), Name varchar(20))
    go
  • Что не так с полями БД?

    Sland Show, имена полей описаны в файле:
    spring-mvc-hibernate-mysql-integration-crud-example/src/main/java/com/javabycode/springmvc/model/Student.java

    у вас там идет описание полей:
    @Column(name = "NAME", nullable = false)
    или
    @Column(name = "nationality", nullable = false)
    и т. д.

    где-то name в верхнем регистре, где-то в нижнем.
  • Не работает код?

    А почему вы в SQL запросе не хотите вычесть эти 0,0002?

    например так:
    SELECT btc - 0.0002, * FROM users

    0,0002 лучше передать как параметр в запрос:
    SELECT btc - ?, * FROM users