在角斗士日期 SQL 服务器之前购买了电影

purchased a movie earlier than Gladiator date SQL SERVER

我需要指导和帮助来解决我从未在 SQL SERVER 中做过的问题。

我有这个数据:

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 购买了角斗士。我如何创建一个像上面那样的列来显示客户是否在角斗士日期之前购买了电影?

您可以使用条件聚合和 window/analytic 功能来做到这一点:

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 Fiddle

您需要在同一查询中进行聚合和详细信息,因此请使用窗口化聚合函数:

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

您可以加​​入 table 并查询角斗士电影:

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