试图在历史上查询首次参加者

时间:2016-06-06 19:02:51

标签: mysql sql-server date

我应该首先说我非常喜欢这个。

我正在尝试编写一个sql查询来提供以下内容:

日期/身份证/姓名/门票/金额/首次出现

19/05/2016 / BFDFRE002 / J.Smith / 2 /£15 / 10/10/2014

我可以很容易地获得所有信息,除了第一次展示EVER。我在我的查询中使用日期参数,因为我正在寻找为特定节目购买门票的人 - 但是这个参数也用于我的第一个节目列,而我希望它是他们的第一个节目的日期时间开始了(即没有日期参数)!

我的查询是:

SELECT      EventDate, CustomerID, dcName, 
                dshowName, Count(TransactNum) AS tickets, Sum(ItemPrice) as Amount,
                MIN(EventDate) AS First_Show

FROM         Dwh.DimEvents LEFT OUTER JOIN
                  Dwh.DimShows LEFT OUTER JOIN
                  Dwh.DimShowTypes ON Dwh.DimShows.dshShowTypeGuid = Dwh.DimShowTypes.dstGuid ON 
                  Dwh.DimEvents.devShowGuid = Dwh.DimShows.dshGuid RIGHT OUTER JOIN
                  Dwh.DimClients RIGHT OUTER JOIN
                  Dwh.FactTickets ON Dwh.DimClients.dcClientGUID = Dwh.FactTickets.ftClientGuid ON Dwh.DimEvents.devGuid = Dwh.FactTickets.ftEventGuid


WHERE     (EventDate > CONVERT(DATETIME,  '2016-05-17 00:00:00', 102))
Group by EventlDate, CustomerID, dcName, dshName

我认为我需要有一个子查询,但我不能有2个选择查询,所以现在我有点卡住了。

我的最终目标是有一个专栏,告诉我第一个节目日期是否在事件日期之前,这意味着这不是他们的第一次(或者相反,如果首次显示日期=事件日期,那么他们是第一次参加者) - 但我最初认为这将是第一步

非常感谢任何帮助!

沃尔夫冈。

1 个答案:

答案 0 :(得分:0)

使用CROSS APPLY分别拉入第一个事件日期,例如下面的示例,基于上面不使用子查询的注释将需要修改以匹配。我们还假设CustomerID来自Dwh.DimClients,并且已将表格中的c别名从交叉申请中提交。

SELECT  EventDate ,
    CustomerID ,
    dcName ,
    dshowName ,
    COUNT(TransactNum) AS tickets ,
    SUM(ItemPrice) AS Amount ,
    f.FirstEventDate AS First_Show
FROM    Dwh.DimEvents
    LEFT OUTER JOIN Dwh.DimShows
    LEFT OUTER JOIN Dwh.DimShowTypes ON Dwh.DimShows.dshShowTypeGuid = Dwh.DimShowTypes.dstGuid ON Dwh.DimEvents.devShowGuid = Dwh.DimShows.dshGuid
    RIGHT OUTER JOIN Dwh.DimClients C
    RIGHT OUTER JOIN Dwh.FactTickets ON Dwh.DimClients.dcClientGUID = Dwh.FactTickets.ftClientGuid ON Dwh.DimEvents.devGuid = Dwh.FactTickets.ftEventGuid
    CROSS APPLY ( SELECT    MIN(EventDate) FirstEventDate
                  FROM      Dwh.DimEvents
                            LEFT OUTER JOIN Dwh.DimShows
                            LEFT OUTER JOIN Dwh.DimShowTypes ON Dwh.DimShows.dshShowTypeGuid = Dwh.DimShowTypes.dstGuid ON Dwh.DimEvents.devShowGuid = Dwh.DimShows.dshGuid
                            RIGHT OUTER JOIN Dwh.DimClients
                            RIGHT OUTER JOIN Dwh.FactTickets ON Dwh.DimClients.dcClientGUID = Dwh.FactTickets.ftClientGuid ON Dwh.DimEvents.devGuid = Dwh.FactTickets.ftEventGuid
                  WHERE     CustomerID = C.CustomerID
                ) f
WHERE   ( EventDate > CONVERT(DATETIME, '2016-05-17 00:00:00', 102) )
GROUP BY EventlDate ,
    CustomerID ,
    dcName ,
    dshName;