Задать вопрос
  • Почему с фильтром PostgreSQL выдаёт больше записей?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если у клиента ВСЕ записи ранее текущего года НЕ соответствуют условию WHERE, то эти записи будут отброшены ещё до группировки. И клиент попадёт в выборку, потому что останутся только записи текущего года. Проверять надо после группировки:
    HAVING MAX(   (apps.in_trash is not true 
               and apps.status = 4 
               and apps.filial_id = 1 
               and apps.invoice_id is not null
                   ) :: INT
               ) > 0
    Ответ написан
    Комментировать
  • Почему с фильтром PostgreSQL выдаёт больше записей?

    Melkij
    @Melkij
    PostgreSQL DBA
    Смотрите свои данные. Совершенно логично, что если у вас есть клиент №5 с такими данными:
    insert into appointments (customer_id, in_trash, status, filial_id, invoice_id, time_start) values 
    (5, false, 4, 1, null, '2023-12-23'),
    (5, false, 4, 1, 123, '2024-01-13')

    то он не попадёт в результат первого запроса, но попадёт в результат второго. И оба ответа верны, а вот какой из них хочет знать бизнес - уточнять надо у бизнеса.
    Ответ написан
    Комментировать
  • Почему с фильтром PostgreSQL выдаёт больше записей?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    До группировки в первом случае в исходную выборку попадают строки, в которых invoice_id == NULL, среди которых есть такие, что time_start < '2024-01-01 00:00:00'. Соответственно, customer_id из них отсеивается в HAVING.
    Пример:
    |-------------+------------+---------------------|
    | customer_id | invoice_id |      time_start     |
    |-------------+------------+---------------------|
    |         1   |     null   | 2023-12-31 00:00:00 |
    |         1   |        1   | 2024-02-01 00:00:00 |
    |-------------+------------+---------------------|

    В первом случае в предварительную выборку попадают обе строки и, поскольку MIN(time_start) == '2023-12-31 00:00:00' < '2024-01-01 00:00:00', то customer_id == 1 в финальную выборку не попадает.
    Во втором случае в предварительную выборку попадает только вторая строка и, поскольку MIN(time_start) == '2024-02-01 00:00:00' > '2024-01-01 00:00:00', то customer_id == 1 попадает в финальную выборку.
    Ответ написан
    Комментировать
  • Почему с фильтром PostgreSQL выдаёт больше записей?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Потому что time_start у некоторых, пришедших не в этом году, имеет invoice_id is null по старым записям. Раньше эти записи попадали в предыдущие года и давали min(time_start) в прошлом, а после дополнительного условия time_start у всех отобранных попадает уже в текущий год и min(time_start) попадает в условие отбора.
    Ответ написан
    Комментировать
  • Как проверить SAS диски с помощью MHDD?

    Zettabyte
    @Zettabyte
    Проф. восстановление данных ▪ Вопрос? См. профиль
    rPman прав.

    Я (весьма нескромно) дополню его ответ. Если у вас именно САС винчестер, то Р.тестер вам надо брать в первую очередь.
    Нам неизвестна какая-либо другая, доступная конечным пользователям, и тем более, бесплатная утилита, которая предлагала бы столько возможностей для САС и СКАЗИ.

    Посмотрите сами - там вплоть до возможности отправить ATA-команды вручную, ещё и с подсказками.

    Также с помощью программы вы сможете посмотреть SMART для SAS и SCSI дисков. При том, что формально это можно сделать только для SATA.

    Графики там тоже будут отличные, думаю, что детальнее, чем в MHDD (очень давно ей не пользовался). Это - тоже одна из фич R.tester - графики могут быть настолько детализированными, насколько это возможно. Можно увидеть переходы между зонами, переключение между головками, и т.п.
    Результат можно получить настолько детальный, что для самых современных (очень больших) дисков на некоторых машинах может не хватить оперативной памяти.

    Вот тут есть видео, где кратко упоминается работа с SAS, SCSI, и Fibre Channel (с отметки 8:35).

    вроде бы есть какие-то контроллеры, которые "видит" MHDD

    Возможно, такие САС-контроллеры действительно есть. Не удивлюсь, если их возраст окажется сопоставим с возрастом МХДД. Но тогда возникнет вопрос не о ДОС, а о том, будут ли они поддерживать ваши диски.

    И, кстати, если вы спросите меня чем поработать со SCSI или SAS HDD под DOS, то я крепко задумаюсь - в голову сходу не приходит ничего, что гарантированно бы заработало.
    Ответ написан
    Комментировать
  • Как проверить SAS диски с помощью MHDD?

    @rPman
    https://rlab.ru/tools/rtester.html умеет нативно много что, в т.ч. работает с sas дисками.

    Если прямо очень надо mhdd (графики посмотреть?), то я бы предложил странное (вы же хотите dos программой sas диски проверять), создать виртуалку с dos, пробросить в нее диск как диск целиком, и проверять. Понятно что никаких низкоуровневых операций оно не выполнит, потому что с sas и так не умеет работать.
    Ответ написан
    2 комментария
  • IText7 htmlpdf почему не отображается кириллица?

    @Benchstyle Автор вопроса
    Вместо:
    fontProvider.AddStandardPdfFonts();
    Указал:
    fontProvider.AddFont(FONT_FILENAME, PdfEncodings.IDENTITY_H);

    Тема закрыта
    Ответ написан
    Комментировать
  • Как сделать перенос строки в сообщении от Telegram Bot?

    @devtricks
    sendMessage?chat_id=45311499&text=Первая%20строка.%0AВторая%20строка.
    Этот способ получился у меня.
    Ответ написан
    Комментировать
  • Как сделать оптимальную перестановку элементов массива с XORом индексов?

    bingo347
    @bingo347
    Crazy on performance...
    Так как все индексы мы xor'им с одним и тем же числом cryptor то повторы между i и i ^ cryptor будут заключены в равных отрезках, притом размер этого отрезка всегда будет ближайшей от cryptor степенью 2 сверху, а сами повторы будут распределены в разных половинах данных отрезков, длина половинок соответственно ближайшая от cryptor степенью 2 снизу.
    Ну и нужно не забывать, что есть крайний случай, когда cryptor равен 0, при котором перестановок вообще не будет
    uint8_t main_buffer[512];
    uint8_t cryptor;
    
    cryptor = readCryptor();
    
    if(cryptor != 0)
    {
        // вычислим ближайшую к cryptor степень 2 снизу
        uint8_t pow2 = 0x80;
        while((pow2 & cryptor) == 0) pow2 >>= 1;
    
        while(readNext512Bytes(main_buffer))
        {
            // один большой цикл заменим на 2 маленьких
            // k будет считать отрезки
            // i будет считать позицию внутри отрезка
            for(uint16_t k = 0; k < 512; k += pow2 << 1) for(uint8_t i = 0; i < pow2; i++)
            {
                uint8_t tmp;
                tmp = main_buffer[i + k];
                main_buffer[i + k] = main_buffer[(i + k) ^ cryptor];
                main_buffer[(i + k) ^ cryptor] = tmp;
            }
        }
    }
    Ответ написан
    1 комментарий