Query SQL ... selezione di più valori massimi. Aiuto richiesto
Domanda
Business World 1256987 mensile 10-10-10-2019
Business World 1256987 mensile 10 2009-09-23
Business World 1256987 mensile 10 2009-08-18
Linux 4 U 456734 mensile 25 2009-12-24
Linux 4 U 456734 del 25 novembre 2009-11-11
Linux 4 U 456734 mensile 25 2009-10-28
Ottengo questo risultato con la query:
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
Ciò di cui ho bisogno è la data più recente in ogni diario?
Ho provato questa query:
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)
Ma mi dà il massimo da tutta la colonna. Il mio risultato necessario avrà due date (massimo per ogni rivista), ma questa domanda mi dà solo una?
Soluzione
Dovresti usare Raggruppa per se hai bisogno della data di scadenza massima. Dovrebbe assomigliare a questo:
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
Altri suggerimenti
È possibile modificare l'istruzione WHERE per cercare l'ultima data per ciascun journal:
AND ljd.receipt_date = (
SELECT max(subljd.receipt_date)
from lib_journal_details subljd
where subljd.journelname = ljd.journelname)
Assicurati di assegnare alla tabella nella sottoquery un diverso alias dalla tabella nella query principale.
Qualcosa del genere dovrebbe funzionare per te.
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
/
Nota che ho rimosso le tabelle dalla clausola FROM che non contribuisce alla query. Potrebbe essere necessario sostituirli se yopu ha semplificato il tuo scenario a nostro vantaggio.
Separalo in due query una otterrà il nome del diario e la data più recente
declare table @table (journalName as varchar,saleDate as datetime)
insert into @table
select journalName,max(saleDate) from JournalTable group by journalName
seleziona tutti i campi di cui hai bisogno dal tuo tavolo e unisciti a @table con loro. iscriviti su journalName.
Sembra la parte superiore del gruppo. È possibile utilizzare un 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