Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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_Postgresql_Google Bigquery - Fatal编程技术网

Sql 如何有条件地最大限度地退回客户在每次保修索赔中最后购买的产品?

Sql 如何有条件地最大限度地退回客户在每次保修索赔中最后购买的产品?,sql,postgresql,google-bigquery,Sql,Postgresql,Google Bigquery,嗨,我有一个数据表,看起来像这样 订单编号 日期 品名 客户编号 476070 2021年2月24日 保修索赔 ABC123 476069 2021年2月22日 产品C ABC123 476068 2021年2月10日 保修索赔 ABC123 476067 2012年2月1日 保修索赔 ABC123 476064 2021年1月23日 产品B ABC123 476051 2021年1月10日 保修索赔 ABC123 475023 2021年1月1日 产品A ABC123 一种方法,首先在每个时间

嗨,我有一个数据表,看起来像这样

订单编号 日期 品名 客户编号 476070 2021年2月24日 保修索赔 ABC123 476069 2021年2月22日 产品C ABC123 476068 2021年2月10日 保修索赔 ABC123 476067 2012年2月1日 保修索赔 ABC123 476064 2021年1月23日 产品B ABC123 476051 2021年1月10日 保修索赔 ABC123 475023 2021年1月1日 产品A ABC123
一种方法,首先在每个时间点查找每个客户的最新订单:

以cte为例 选择*,当ProductName“保修申请”结束时,选择MAXCASE,然后选择OrderID结束 按CustomerID按日期按订单划分MaxOrderID 从你的桌子上 选择t1.OrderID、t1.Date、t1.ProductName、t1.CustomerID、, t1.ProductName=“保修申请”时的情况 然后t2.ProductName将作为LASTPRODUCTPURCHASE结束 来自cte t1 内部联接表t2 在t2.CustomerID=t1.CustomerID和 t2.OrderID=t1.MaxOrderId;
请注意,返回原始表的联接会从最近的非保修交易中提取最新的产品名称。

这里是使用lead的另一种方法:

这里是,包括@Tim Biegeleisen答案,如果允许CTE,我会选择哪个答案。
另外,为了更好地检查,我在dbfiddle中添加了更多带有样本数据的行。

如果您能在回答中加入一个fiddle,我将不胜感激。我现在正在打手机,我还没有测试上述代码。好的,我已经试过了,但似乎不起作用。保修索赔返回上次产品购买中的保修索赔column@TimBiegeleisen注意区分大小写。我在问题This works中发布了上述查询的结果!非常感谢你。由于使用lead,此查询是否有任何警告?@SyedAriff实际上我想不出会出现任何问题,我想唯一需要注意的是顺序,确保数据的顺序正确。
select orderid,Date,productname,customerid,
       case when productname = 'WARRANTY CLAIM' then
       max(lastpn)over(partition by customerid order by orderid) else null end as LASTPRODUCTPURCHASE 
       from (
             select tb.*, 
             case when lead(productname)over(partition by customerid order by OrderID desc) = 'WARRANTY CLAIM' then null 
             else lead(productname)over(partition by customerid order by OrderID desc) end as lastpn
             from tb
            ) a