Nano Hash - криптовалюты, майнинг, программирование

Получить последнюю строку из группы, ограничить количество результатов в PostgreSQL

У меня есть таблица с записями, представляющими журнал, в этом примере я опускаю остальные столбцы.

Столбец id является автоинкрементным, item_id представляет элемент в приложении.

Мне нужно получить последние item_id, например два или три

CREATE TABLE "log" (
    "id" INT,
    "item_id" INT
);

-- TRUNCATE TABLE "log";
INSERT INTO "log" ("id", "item_id") VALUES
    (1, 1),
    (2, 2),
    (3, 1),
    (4, 1),
    (5, 3),
    (6, 3);

Базовый запрос отобразит все результаты, самые последние вверху:

SELECT *
FROM "log"
ORDER BY "id" DESC
id  item_id
6   3
5   3
4   1
3   1
2   2
1   1

Я хотел бы иметь только два (LIMIT 2) последних item_id с их идентификатором. Последний означает - вставлен последним (ORDER BY id).

id  item_id
6   3
4   1

Последние три будут

id  item_id
6   3
4   1
2   2

Как только возвращается item_id, он больше не возвращается. Таким образом, LIMIT 4 вернет только три строки, потому что существует только три уникальных item_id.

Я, наверное, что-то упускаю. Я уже пробовал разные комбинации DISTINCT OF, GROUP BY, LIMIT и т.д.


ОБНОВЛЕНИЕ #1: После того, как я протестировал запрос S-man (ниже), я обнаружил, что он работает для данных, которые я предоставил, однако он не работает в целом для другого набора данных (последовательность item_id А, Б и снова А.). Вот еще набор данных:

TRUNCATE TABLE "log";
INSERT INTO "log" ("id", "item_id") VALUES
    (1, 1),
    (2, 2),
    (3, 3),
    (4, 3),
    (5, 1),
    (6, 3);

Данные в БД, упорядоченные по id desc:

id  item_id
6   3
5   1
4   3
3   3
2   2
1   1

Ожидаемый результат для последних трех item_id

6   3
5   1
2   2

  • Не могли бы вы показать ожидаемый результат вашего первого примера с LIMIT 4? Как я понимаю теперь: когда значение для определенного item_id было распознано один раз, оно никогда не должно возвращаться снова. Верно? 10.02.2021
  • Да, ты прав. Я обновил вопрос. Если возвращен item_id, он не должен возвращаться (повторяться) снова. Если имеется только три уникальных идентификатора item_id, LIMIT 4 (или запрос без LIMIT) вернет только три строки. 10.02.2021
  • Почему вы постоянно меняете свой вопрос?! 10.02.2021

Ответы:


1

Итак, после трех изменений, теперь мы возвращаемся к самой первой идее:

Просто возьмите DISTINCT ON:

demo:db‹›fiddle

SELECT
    *
FROM (
    SELECT DISTINCT ON (item_id)   -- 1
        *
    FROM log
    ORDER BY item_id, id DESC
) s
ORDER BY id DESC                   -- 2
LIMIT 2
  1. Возвращает ровно одну запись упорядоченной группы. Ваша группа - item_id, идентификатор заказа - DESC, поэтому вы получаете самый высокий идентификатор для каждого item_id.
  2. Измените порядок по идентификатору DESC (вместо ранее заказанного item_id) и ограничьте вывод запроса.
10.02.2021
  • Изменен ответ, добавлено объяснение 10.02.2021
  • Я попробовал ваш запрос на большом наборе данных и обнаружил, что он работает на простом примере, который я предоставил, однако на большом наборе данных он вернул нежелательный результат. Я думаю, что причина была в том, что если снова была последовательность item_id A, B и A, запрос снова возвращал A. Я обновил вопрос. 10.02.2021
  • Подожди, после того, как я прошел слишком много путей, мне пришло в голову, после твоего разъяснения, что самый первый подход теперь самый лучший, вообще. :D :D Изменил ответ, надеюсь в последний раз 10.02.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..