SQL-запрос & # 8230; выбор нескольких максимальных значений. Нужна помощь
Вопрос
Деловой мир 1256987 ежемесячно 10 2009-10-28
Деловой мир 1256987 ежемесячно 10 2009-09-23
Деловой мир 1256987 ежемесячно 10 2009-08-18
Linux 4 U 456734 ежемесячно 25 2009-12-24
Linux 4 U 456734 ежемесячно 25 2009-11-11
Linux 4 U 456734 ежемесячно 25 2009-10-28
<Ч>Я получаю этот результат с помощью запроса:
SELECT DISTINCT ljm.journelname,ljm. subscription_id,
ljm.frequency,ljm.publisher, ljm.price, ljd.receipt_date
FROM lib_journals_master ljm,
lib_subscriptionhistory
lsh,lib_journal_details ljd
WHERE ljd.journal_id=ljm.id
ORDER BY ljm.publisher
<Ч>
Что мне нужно, так это самая последняя дата в каждом журнале?
Я пробовал этот запрос:
SELECT DISTINCT ljm.journelname, ljm.subscription_id,
ljm.frequency, ljm.publisher, ljm.price,ljd.receipt_date
FROM lib_journals_master ljm,
lib_subscriptionhistory lsh,
lib_journal_details ljd
WHERE ljd.journal_id=ljm.id
AND ljd.receipt_date = (
SELECT max(ljd.receipt_date)
from lib_journal_details ljd)
<Ч>
Но это дает мне максимум из всего столбца. В моем необходимом результате будет две даты (максимум каждого журнала), но этот запрос дает мне только одну?
Решение
Вы должны использовать Group By, если вам нужен Max от даты. Должно выглядеть примерно так:
SELECT
ljm.journelname
, ljm.subscription_id
, ljm.frequency
, ljm.publisher
, ljm.price
, **MAX(ljd.receipt_date)**
FROM
lib_journals_master ljm
, lib_subscriptionhistory lsh
, lib_journal_details ljd
WHERE
ljd.journal_id=ljm.id
GROUP BY
ljm.journelname
, ljm.subscription_id
, ljm.frequency
, ljm.publisher
, ljm.price
Другие советы
Вы можете изменить инструкцию WHERE для поиска последней даты для каждого журнала:
AND ljd.receipt_date = (
SELECT max(subljd.receipt_date)
from lib_journal_details subljd
where subljd.journelname = ljd.journelname)
Убедитесь, что таблица в подзапросе отличается от псевдонима таблицы в основном запросе.
Нечто подобное должно работать на вас. Р>
SELECT ljm.journelname
, ljm.subscription_id
, ljm.frequency
, ljm.publisher
, ljm.price
,md.max_receipt_date
FROM lib_journals_master ljm
, ( SELECT journal_id
, max(receipt_date) as max_receipt_date
FROM lib_journal_details
GROUP BY journal_id) md
WHERE ljm.id = md.journal_id
/
Обратите внимание, что я удалил таблицы из предложения FROM, которые ничего не вносят в запрос. Возможно, вам придется заменить их, если yopu упростил ваш сценарий в нашу пользу.
Разделите это на два запроса, один из которых будет содержать название журнала и последнюю дату
declare table @table (journalName as varchar,saleDate as datetime)
insert into @table
select journalName,max(saleDate) from JournalTable group by journalName
выберите все необходимые поля в своей таблице и присоединитесь к ним @table. присоединиться к journalName.
Похоже на вершину группы. Вы можете использовать CTE в SQL Server: р>
;WITH journeldata AS
(
SELECT
ljm.journelname
,ljm.subscription_id
,ljm.frequency
,ljm.publisher
,ljm.price
,ljd.receipt_date
,ROW_NUMBER() OVER (PARTITION BY ljm.journelname ORDER BY ljd.receipt_date DESC) AS RowNumber
FROM
lib_journals_master ljm
,lib_subscriptionhistory lsh
,lib_journal_details ljd
WHERE
ljd.journal_id=ljm.id
AND ljm.subscription_id = ljm.subscription_id
)
SELECT
journelname
,subscription_id
,frequency
,publisher
,price
,receipt_date
FROM journeldata
WHERE RowNumber = 1