【问题标题】:purchased a movie earlier than Gladiator date SQL SERVER在 Gladiator 日期 SQL SERVER 之前购买了电影
【发布时间】:2015-07-31 13:30:33
【问题描述】:

我需要指导和帮助来解决我在 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 购买了 Gladiator。我如何创建一个像上面那样的列来显示客户是否是否购买了早于角斗士日期的电影?

【问题讨论】:

    标签: sql select sql-server-2012 row rank


    【解决方案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 Fiddle

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多