购买了一部电影早于角斗士日期SQL SERVER(purchased a movie earlier

2019-10-23 03:21发布

我需要指导和帮助有一个问题,我从来没有在SQL服务器上完成。

我有这样的数据:

Cust_Nr     Date        FilmName
157649306   20150430    Inside Llewyn Davis 
158470722   20150504    Nick Cave: 20,000 Days On Earth
158467945   20150504    Out Of The Furnace 
158470531   20150504    FilmA
157649306   20150510    Gladiator
158470722   20150515    Gladiator

客户号: 158470722买了两部电影,1 ):Inside Llewyn Davis和2) Gladiator在不同的日期。 我试图在SQL SERVER做的是这样的:

 Cust_Nr    Date        FilmName                  Before Gladiator Purchase
    157649306   20150430    Inside Llewyn Davis              1
    158470722   20150504    Nick Cave: 20,000 Days On Earth  1
    158467945   20150504    Out Of The Furnace               0
    158470531   20150504    FilmA                            0
    157649306   20150510    Gladiator                        0
    158470722   20150515    Gladiator                        0

如果我们看一下日期为客户NR: 157649306 ,他购买的日期,20150430电影,并购买了角斗士如何创建一个列类似上面的显示,如果客户已在购买了电影20150510.日期早于斗士日期?

Answer 1:

您可以使用条件聚集和窗口/分析功能做到这一点:

SELECT *,CASE WHEN [Date] < MIN(CASE WHEN FilmName = 'Gladiator' 
                                     THEN [Date] 
                                END) OVER(PARTITION BY Cust_Nr)  
              THEN 1 
              ELSE 0 
         END AS Before_Gladiator
FROM Table1

演示: SQL小提琴



Answer 2:

你需要agregation和细节在同一个查询,所以使用窗式聚合函数:

case 
   when Date < min(case when FilmName = 'Gladiator' then Date end)
               over (partition by Cust_Nr)
   then 1
   else 0 
end


Answer 3:

你可以加入表上的斗士电影的查询:

SELECT    t.*,
          CASE WHEN g_date IS NULL OR t.[date] > g_date THEN 1 ELSE 0 END
FROM      mytable t
LEFT JOIN (SELECT [date] AS g_date, Cust_Nr
           FROM   mytable
           WHERE  FileName = 'Gladiator') g ON t.Cust_Nr = g.Cust_Nr


文章来源: purchased a movie earlier than Gladiator date SQL SERVER