我有以下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
如果有人有解决这个麻烦的好主意
答案 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
其中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