如何从另一个表中获取具有最旧值的项目列表

时间:2019-07-19 19:44:11

标签: sql sqlite

我有以下2张桌子:

table : Compte
IDcompte | Nom  | Prenom
--------------------------
1        | nom1 | prenom1
2        | nom2 | prenom2
3        | nom3 | prenom3
4        | nom4 | prenom4

table : Facture
IDfacture | valeur  | date       | IDcompte
--------------------------------------------
1         | 19      | 01/01/2019 | 3
2         | 15      | 04/01/2019 | 3
3         | 10      | 01/01/2019 | 2
4         | 13      | 09/01/2019 | 3
5         | 12      | 04/01/2019 | 1
6         | 10      | 06/01/2019 | 3
7         | 11      | 05/01/2019 | 2

我想获取所有帐户的列表,对于每一个compte,我都希望关联的最新构造。 如何使用SQL获得此结果?

IDcompte | Nom  | Prenom  | valeur  | date  
-------------------------------------------
1        | nom1 | prenom1 | 12      | 04/01/2019
2        | nom2 | prenom2 | 11      | 05/01/2019
3        | nom3 | prenom3 | 13      | 09/01/2019
4        | nom4 | prenom4 | null    | null

我尝试过

Select *
FROM Compte
INNER JOIN
    (SELECT IDfacture, MAX(date) AS lastdate
    FROM Facture
    GROUP BY IDfacture) 
ON Compte.IDcompte = Facture.IDcompte

如果有人有解决这个麻烦的好主意

4 个答案:

答案 0 :(得分:0)

您应使用左连接并按IDcompte分组

    Select *
    FROM Compte
    LEFT JOIN
        (SELECT Idcompte, MAX(date) AS lastdate
        FROM Facture
        GROUP BY Idcompte) c
    ON Compte.IDcompte = c.IDcompte

答案 1 :(得分:0)

您可以两次申请LEFT JOIN

with cc as
(
select c.IDcompte, Nom, Prenom, max(date) max_date
  from Compte c
  left join Facture f 
    on f.IDCompte = c.IDCompte
 group by c.IDcompte, Nom, Prenom
)
select cc.IDcompte, Nom, Prenom, valeur, f.date
  from cc 
  left join Facture f on f.IDcompte = cc.IDcompte
   and f.date = max_date 
 order by cc.IDcompte;


idcompte    nom     prenom  valeur  date
1           nom1    prenom1 12      2019-01-04
2           nom2    prenom2 11      2019-01-05
3           nom3    prenom3 13      2019-01-09
4           nom4    prenom4 

Demo

其中yyyy-mm-dd是标准日期格式,而不是dd/mm/yyyy

答案 2 :(得分:0)

我不确定sqllite是否支持此功能,但是您可以尝试。

如果SQLlite具有窗口功能,那将大大简化它。

Select *
FROM Compte
INNER JOIN
    ( SELECT F1.*
        FROM Facture F1
       INNER
        JOIN 
             (SELECT IDfacture, MAX(date) AS lastdate
                FROM Facture
               GROUP 
                  BY IDfacture
              HAVING date = MAX(date)
             ) F2
            ON F1.IDfacture = F2.IDfacture
  ) LatestFacture
ON Compte.IDcompte = LatestFacture.IDcompte

如果它具有窗口功能,则可以执行以下操作:

Select *
FROM Compte
INNER JOIN
    ( SELECT F1.*,
             RANK() OVER ( PARTITION BY F1.IDFacture ORDER BY Date DESC ) rnk
        FROM Facture F1
    ) FACTURE_WITHRANK
  ON COMPTE.IDcompte = FACTURE_WITHRANK.IDcompte
 AND FACTURE_WITHRANK.rnk = 1

答案 3 :(得分:0)

谢谢大家。我找到了解决方法

Select *
FROM Compte
LEFT JOIN
    (SELECT Facture.IDcompte, MAX(date) AS lastdate
    FROM Facture
    GROUP BY Facture.IDcompte) c
ON Compte.IDcompte = c.IDcompte