Tsql 从两个表中为每个客户选择第一个订单

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

大家好,我有两个表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_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非常感谢现在起作用的东西。