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顺便说一句,窗口函数是非常宝贵的。它们非常值得你花时间去适应它们