SQL-запрос & # 8230; выбор нескольких максимальных значений. Нужна помощь

StackOverflow https://stackoverflow.com/questions/1636758

  •  06-07-2019
  •  | 
  •  

Вопрос

Деловой мир 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 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top