Sql 如何选择客户最近购买的产品?
在一个包含多个表以及它们之间关系的数据库中,我只想选择去年客户最近的付款 我的问题是这样的:Sql 如何选择客户最近购买的产品?,sql,sql-server,join,greatest-n-per-group,Sql,Sql Server,Join,Greatest N Per Group,在一个包含多个表以及它们之间关系的数据库中,我只想选择去年客户最近的付款 我的问题是这样的: SELECT P.Name, EV.EventName, FN.Installments, FN.PurchaseValue, FN.DueDate FROM ClientPrivate PF JOIN Client P ON P.PesControle = PF.PesControle JOIN ClientClass CP ON P.PesControle =
SELECT
P.Name,
EV.EventName,
FN.Installments,
FN.PurchaseValue,
FN.DueDate
FROM ClientPrivate PF
JOIN Client P ON P.PesControle = PF.PesControle
JOIN ClientClass CP ON P.PesControle = CP.PesControle
JOIN EVENT EV ON CP.EveControle = EV.EveControle
JOIN Class cc ON cc.CurControle = EV.CurControle
JOIN Finance FN ON FN.PesControle = P.PesControle
它返回我需要的值,只是我只想得到每个客户最近购买的商品,而不是所有商品
我编辑以帮助澄清。“Controle”列是键。无论您的日期列是什么,它都会被放在ROW_NUMBER()函数的ORDER BY子句中,您就可以开始了
;WITH CTE AS
(
SELECT
P.PesNome,
EV.EveDescri,
FN.FinTotParc,
FN.FinVlrLiquido,
FN.FinDiaVencto,
ROW_NUMBER() OVER (PARTITION BY P.PesNome ORDER BY [DateColumn] DESC) rn
FROM PessoaFisica PF
JOIN Pessoa P ON P.PesControle = PF.PesControle
JOIN CursoPessoa CP ON P.PesControle = CP.PesControle
JOIN EVENTO EV ON CP.EveControle = EV.EveControle
JOIN Curso cc ON cc.CurControle = EV.CurControle
JOIN Financeiro FN ON FN.PesControle = P.PesControle
)
SELECT *
FROM CTE
WHERE rn = 1
我猜
Financeiro.FinDiaVencto
是您的购买日期,Pessoa.PesControle
是一个人的唯一标识符。如果没有,则需要修改查询。我正在用谷歌翻译葡萄牙语,我还不清楚
SELECT
P.PesNome,
EV.EveDescri,
FN.FinTotParc,
FN.FinVlrLiquido,
FN.FinDiaVencto
FROM PessoaFisica PF
JOIN Pessoa P
ON P.PesControle = PF.PesControle
JOIN CursoPessoa CP
ON P.PesControle = CP.PesControle
JOIN EVENTO EV
ON CP.EveControle = EV.EveControle
JOIN Curso cc
ON cc.CurControle = EV.CurControle
JOIN Financeiro FN
on FN.PesControle = P.PesControle
WHERE EXISTS (
SELECT 1
FROM PessoaFisica PF_s
JOIN Pessoa P_s
ON P_s.PesControle = PF_s.PesControle
JOIN CursoPessoa CP_s
ON P_s.PesControle = CP_s.PesControle
JOIN EVENTO EV_s
ON CP_s.EveControle = EV_s.EveControle
JOIN Curso cc_s
ON cc_s.CurControle = EV_s.CurControle
JOIN Financeiro FN_s
on FN_s.PesControle = P_s.PesControle
WHERE P_s.PesControle = P.PesControle
HAVING MAX(FN_s.FinDiaVencto) = FN.FinDiaVencto
)
这将返回每个Pessoa.PesControle
的最新Financeiro.FinDiaVencto
记录。如果按课程或事件(?)需要它,则还需要修改WHERE
子句以加入这些字段
我不确定加入PessoaFisica是否必要,但我加入了它,因为它可能会消除记录。您可以在子查询中包含一个
分组依据
,但它应该是多余的。哪列是客户机和日期的标识符?你的列名不清楚。我猜PesNome
是name,哪一个是date列?Fin=End,Dia=Day,Nome=name,感谢谷歌翻译:)