J'ai cette requête:

select article_number, date, company, size, price 
from price 
order by article_number, company, date

Qui produit ces résultats:

('50240-20', '2016-03-08 13:06:12.872955', '2B', '20', '645,75')
('50240-20', '2016-03-08 13:13:55.311955', '2B', '20', '645,75')
('50240-20', '2016-03-08 13:47:13.737155', '2B', '20', '645,75')
('50240-20', '2016-03-08 13:51:32.677155', '2B', '20', '645,75')
('50240-20', '2016-03-08 13:06:12.872955', 'Bio', '20', '423,20')
('50240-20', '2016-03-08 13:13:55.311955', 'Bio', '20', '423,20')
('50240-20', '2016-03-08 13:47:13.737155', 'Bio', '20', '423,20')
('50240-20', '2016-03-08 13:51:32.677155', 'Bio', '20', '423,20') ...

Je souhaite limiter les résultats pour chaque sélection article_number et company afin qu'elle ne montre que 2 résultats avec 2 dernières dates différentes. Le résultat devrait donc ressembler à:

('50240-20', '2016-03-08 13:47:13.737155', '2B', '20', '645,75')
('50240-20', '2016-03-08 13:51:32.677155', '2B', '20', '645,75')

('50240-20', '2016-03-08 13:47:13.737155', 'Bio', '20', '423,20')
('50240-20', '2016-03-08 13:51:32.677155', 'Bio', '20', '423,20') ...

Quelqu'un peut-il m'aider à faire cela? Une simple limite de 2 à la fin ne donnera que 2 résultats et pas pour chaque "groupe"

THX!

0
Eternal_Sunshine 8 mars 2016 à 16:44

3 réponses

Meilleure réponse

Vous n'avez pas spécifié votre SGBD donc pour ORACLE, POSTGRESQL, SQL-SERVER peut utiliser ROW_NUMBER () comme ceci:

SELECT * FROM (
    select article_number, date, company, size, price ,
       ROW_NUMBER() OVER(PARTITION BY article_number,company ORDER BY date DESC) as rnk
    from price )
WHERE rnk <= 2
order by article_number, company, date

Solution pour MYSQL:

SELECT * FROM (
    select t.article_number, t.date, t.company, t.size, t.price , count(*) as rnk
    from price t
    INNER JOIN price s
    ON(t.article_number = s.article_number and t.company = s.company and t.date <= s.date)
    GROUP BY t.article_number,t.company,t.date,t.size,t.price
)
WHERE rnk <= 2
order by article_number, company, date

MODIFIER : je vois son sqlite, essayez la deuxième solution pour MYSQL, cela devrait aussi fonctionner pour sqlite ..

1
sagi 8 mars 2016 à 13:59

Si Oracle:

Ajouter ROW_NUMBER () OVER (PARTITION PAR COLNAME ORDER BY COLNAME) RN

En tant que colonne et envelopper votre requête dans une requête SELECT. Dans la requête parent, utilisez la colonne RN pour limiter les résultats par groupe.

0
Thomas 8 mars 2016 à 13:51

Il s'agit d'une solution générique que vous pouvez utiliser dans presque tous les RDMBS qui ne prennent pas en charge partition by

select article_number,date, company, size, price from 
(
    select p1.article_number,p1.company,
    count(p1.date) as rno,
    max(p1.date) as date,max(p1.size) as size,max(p1.price) as price
    from price p1 
     inner join price p2
    on p1.article_number=p2.article_number 
     and p1.company=p2.company 
     and p1.date<=p2.date
    group by p1.article_number,p1.company,p1.date
) t1
where t1.rno<=2
0
Utsav 8 mars 2016 à 14:20