SQL Server:确定新列中二进制状态的查询,列出每个组最近的行?

SQL Server:确定新列中二进制状态的查询,列出每个组最近的行?,sql,sql-server,Sql,Sql Server,到处寻找类似的情况,但找不到解决方案。如果不使用临时表,可能太复杂了 我希望能够创建一个新列,显示客户是否使用过优惠券。除此之外,还需要提取最近购买的商品,并按姓氏排序 我已经能够通过分区获得最新的事务,但是找不到查找优惠券用户的逻辑。这可以在一个步骤中高效地完成,还是必须输出到一个临时表 输入数据: TransDateTime TransID CustID FirstName LastName NumItems TotalAmt CouponUsed 201

到处寻找类似的情况,但找不到解决方案。如果不使用临时表,可能太复杂了

我希望能够创建一个新列,显示客户是否使用过优惠券。除此之外,还需要提取最近购买的商品,并按姓氏排序

我已经能够通过分区获得最新的事务,但是找不到查找优惠券用户的逻辑。这可以在一个步骤中高效地完成,还是必须输出到一个临时表

输入数据:

TransDateTime       TransID CustID  FirstName   LastName    NumItems    TotalAmt    CouponUsed
2018-01-09 11:57:24 39451634836 334096  Al  Einstein    5   $1,420.44   Coupon
2018-01-14 17:15:25 39451634837 299080  George  Clooney 1   $816.64 
2018-01-15 19:34:42 39451634838 212950  Stephanie   Germanauto  2   $2,583.64   
2018-01-15 22:32:06 39451634839 258006  Sandy   Bullock 2   $718.36 
2018-01-16 23:34:23 39451634840 212950  Stephanie   Germanauto  3   $1,432.63   
2018-01-18 09:38:39 39451634841 299080  George  Clooney 8   $1,073.50   
2018-01-18 19:36:42 39451634842 258006  Sandy   Bullock 4   $1,035.75   Coupon
2018-01-20 05:58:48 39451634843 334096  Al  Einstein    3   $1,145.06   
2018-01-25 12:16:11 39451634844 212950  Stephanie   Germanauto  7   $1,059.55   
2018-01-31 11:09:41 39451634845 258006  Sandy   Bullock 6   $633.98 Coupon
2018-02-02 14:17:44 39451634846 299080  George  Clooney 9   $925.55 
2018-02-03 19:57:32 39451634847 212950  Stephanie   Germanauto  6   $685.47 Coupon
输出数据:

TransDateTime   TransID CustID  FirstName   LastName    NumItems    TotalAmt    CouponUsed  CouponCust
2018-01-31 11:09:41 39451634845 258006  Sandy   Bullock 6   $633.98     Coupon  Yes
2018-02-02 14:17:44 39451634846 299080  George  Clooney 9   $925.55         
2018-01-20 05:58:48 39451634848 334096  Al  Einstein    3   $1,145.06       Yes
2018-02-03 19:57:32 39451634847 212950  Stephanie   Germanauto  6   $685.47     Coupon  Yes
有人有什么想法吗


提前感谢您为我指明了正确的方向。

一个选项是使用window function
Max()over()

示例

;with cte as (
Select *
      ,CouponCust = max(case when CouponUsed='Coupon' then 'Yes' else 'No' end) over (Partition By CustID)
      ,RN         = Row_Number() over (Partition By CustID order by TransDateTime Desc)
 From  YourTable
) 
Select *
 From  cte 
 Where RN=1
返回


该输出是您当前获得的还是您想要获得的?到目前为止你有什么疑问?谢谢@marc_s清理数据!我使用了“代码”。你用什么来整理它?如果你发布代码、XML或数据样本,在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码样本”按钮(
{}
),以很好地格式化和语法突出显示它们-或者只需从leftYes@Xedni插入至少四个空格的代码或样本数据,这就是我需要的输出。约翰·卡佩莱蒂向我展示了什么效果很好。谢谢,@marc_!下次我会用你的方式试试。@SquareDonut很乐意帮忙。@SquareDonut如果你愿意,请接受回答谢谢,约翰!这正是我想做的。我看了“max()”,但我不明白它为什么会起作用。最多需要多少钱?似乎“案例”本身就应该起作用。你能解释一下吗?@SquareDonut这是窗口函数max()over()。因此,如果客户曾经使用过优惠券,它将返回Yes。是大于否或为空。尝试不使用WHERE RN=1的查询。您可能会有更多的见解。@SquareDonut顺便说一句,窗口函数是非常宝贵的。它们非常值得你花时间去适应它们