Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何选择客户最近购买的产品?_Sql_Sql Server_Join_Greatest N Per Group - Fatal编程技术网

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,感谢谷歌翻译:)