Requête SQL & sélection de plusieurs valeurs maximales. Besoin d'aide
Question
Business World 1256987 mensuel 10 2009-10-28
Business World 1256987 mensuel 10 2009-09-23
Business World 1256987 mensuel 10 2009-08-18
Linux 4 U 456734 mensuel 25 2009-12-24
Linux 4 U 456734 mensuel 25 2009-11-11
Linux 4 U 456734 mensuel 25 2009-10-28
Je reçois ce résultat avec la requête:
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
Ce dont j'ai besoin, c'est la date la plus récente dans chaque journal?
J'ai essayé cette requête:
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)
Mais cela me donne le maximum de toute la colonne. Mon résultat souhaité aura deux dates (maximum de chaque magazine), mais cette requête ne m'en donne qu'une?
La solution
Vous devez utiliser Grouper par si vous avez besoin de la date de début maximal. Devrait ressembler à quelque chose comme ceci:
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
Autres conseils
Vous pouvez modifier l'instruction WHERE pour rechercher la dernière date de chaque journal:
AND ljd.receipt_date = (
SELECT max(subljd.receipt_date)
from lib_journal_details subljd
where subljd.journelname = ljd.journelname)
Assurez-vous de donner à la table de la sous-requête un alias différent de celui de la table de la requête principale.
Quelque chose comme ça devrait marcher pour vous.
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
/
Notez que j'ai supprimé les tables de la clause FROM qui ne contribuent en rien à la requête. Vous devrez peut-être les remplacer si vous avez simplifié votre scénario à notre avantage.
Séparez-le en deux requêtes, l'une obtiendra le nom du journal et la date la plus récente
declare table @table (journalName as varchar,saleDate as datetime)
insert into @table
select journalName,max(saleDate) from JournalTable group by journalName
Sélectionnez tous les champs dont vous avez besoin dans votre table et rejoignez @table avec eux. rejoindre sur journalName.
Cela ressemble au haut du groupe. Vous pouvez utiliser un CTE dans 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