SQL-Abfrage ...mehrere max-Wert Auswahl.Hilfe benötigt
Frage
Business-Welt 1256987 monatlich 10 2009-10-28
Business-Welt 1256987 monatlich 10 2009-09-23
Business-Welt 1256987 monatlich 10 2009-08-18
Linux 4 U 456734 monatlichen 25 2009-12-24
Linux 4 U 456734 monatlichen 25 2009-11-11
Linux 4 U 456734 monatlichen 25 2009-10-28
Ich bekomme dieses Ergebnis mit der Abfrage:
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
Was ich brauche, ist das neueste Datum in jedem journal?
Ich habe versucht, diese Abfrage:
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)
Aber es gibt mir die maximale von die gesamte Spalte.Mein gewünschte Ergebnis haben zwei Termine (maximal jedes Magazin), aber diese Abfrage gibt mir nur ein?
Lösung
Sie sollten Gruppierung verwenden, wenn Sie die Max von Datum brauchen. Sollte wie folgt aussehen:
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
Andere Tipps
Sie könnte sich ändern, die WHERE-Anweisung zu suchen, bis das Letzte Datum für jedes journal:
AND ljd.receipt_date = (
SELECT max(subljd.receipt_date)
from lib_journal_details subljd
where subljd.journelname = ljd.journelname)
Achten Sie darauf, geben Sie die Tabelle in der Unterabfrage einen anderen alias aus der Tabelle in der hauptabfrage.
So etwas sollte für Sie arbeiten.
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
/
Beachten Sie, dass ich die Tabellen aus der FROM-Klausel entfernt haben, die nichts auf die Abfrage bei. Sie können sie ersetzen müssen, wenn yopu Ihr Szenario zu unserem Nutzen vereinfacht.
Trennen Sie diese in zwei Abfragen wird ein Journalnamen und aktuelle Datum
erhaltendeclare table @table (journalName as varchar,saleDate as datetime)
insert into @table
select journalName,max(saleDate) from JournalTable group by journalName
Wählen Sie alle Felder, die Sie von Ihrem Tisch brauchen und kommen @table mit ihnen. kommen auf journalName.
Klingt wie Anfang der Gruppe. Sie können mit einem CTE in 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