Tsql 从两个表中为每个客户选择第一个订单
大家好,我有两个表dbo.Sales(客户id、订单日期、产品id)和dbo.Menu(产品id、产品名称、价格)。问题是 每位顾客从菜单中购买的第一项是什么 我的解决办法是Tsql 从两个表中为每个客户选择第一个订单,tsql,Tsql,大家好,我有两个表dbo.Sales(客户id、订单日期、产品id)和dbo.Menu(产品id、产品名称、价格)。问题是 每位顾客从菜单中购买的第一项是什么 我的解决办法是 select A.customer_id,m.product_id, m.product_name from dbo.menu m cross apply (select top 1 * from dbo.sales s where s.product_id=m.product_i
select A.customer_id,m.product_id, m.product_name
from dbo.menu m
cross apply
(select top 1 * from dbo.sales s
where s.product_id=m.product_id
group by s.customer_id,s.order_date, s.product_id
order by s.order_date) A
客户标识产品标识产品名称
寿司
咖喱
C3拉面
缺少的客户是B。它给了我A的第二个第一个订单,而不是B
我需要为每个客户提供
Murat您可以使用
行编号()
窗口函数获取每个客户最早的产品id
,然后加入菜单
表以获取产品详细信息
编辑:将订单更新为ASC
;with cte
as (
select customer_id, product_id, row_number() over (partition by customer_id order by order_date acs) RN
from dbo.Sales)
select c.customer_id, c.product_id, m.product_name
from cte c
join dbo.menu m on c.product_id=m.product_id
where RN = 1
选择不同的s.customer\u id, 第一个值(m.product\u name)(按s.customer\u id按订单日期划分) 作为第一项客户 来自[dbo].[sales]S
加入[dbo].[menu]M on M.product\u id=s.product\u id请阅读一些改进问题的技巧。“菜单中的第一项是什么”是指最低的
product\u id
值,或按product\u name
的字母顺序表示最早的日期?您是否有权提供DDL,这样我们就不必猜测order\u date
是smalldatetime
、nvarchar(max)
还是其他什么了?谢谢代码,但它只为C给出了正确答案。其他人都错了。”A 3 ramen B 3 ramen C 3 ramen'看起来像第行中的order by_number()应该是ASC,而不是DESC,表示订单日期RN@KevinJohnson是的,你说得对。我已经在代码中更新了它。谢谢。@Murat我的代码在上面以正确的顺序更新。现在试试看。@WAMLeslie非常感谢现在起作用的东西。