Sql server 根据不同的事件选择最早日期并连接其他表

Sql server 根据不同的事件选择最早日期并连接其他表,sql-server,sql-server-2012,Sql Server,Sql Server 2012,当前数据: Status table CustomerID Event StartDateTime 1001 check-in 2015-04-13 10:15 1001 Transfer 2015-04-13 10:30 1001 check-in 2015-04-13 10:45 1001 check-out 2015-04-13 12:00 2001 Transfer

当前数据:

Status table
CustomerID    Event      StartDateTime
1001          check-in   2015-04-13 10:15
1001          Transfer   2015-04-13 10:30
1001          check-in   2015-04-13 10:45
1001          check-out  2015-04-13 12:00
2001          Transfer   2015-04-15 12:00
2001          check-out  2015-04-15 12:30
3001          WaitRoom   2015-05-16 10:00
3001          check-in   2015-05-16 10:15

Location table
CustomerID    Location
1001          River
2001          Mountain
3001          Sun Rise

Facilty table
Customer ID     Description
1001            Gym
2001            Pool
3001            Breakfast

Required result:
CustomerID  Event     StartDateTime     Location     Description
1001        check-in  2015-04-13 10:15  River        Gym
2001        Transfer  2015-04-15 12:00  Mountain     Pool
3001        check-in  2015-05-16 10:15  Sun Rise     Breakfast
最早的StartDateTime是根据第一次签入或转机事件选择的。从第一次入住开始获取StartDateTime。如果没有办理登机手续,则获取第一次换乘开始日期。非常感谢。 更新: 下面是我正在尝试的,但仍然没有产生正确的结果


希望有帮助:)

您可以使用
行编号来完成此操作:


不使用
行号


这可以通过分配一个虚拟列组(根据您的逻辑将其更改为匹配)然后为列组分配一个
行编号来处理。然后,只需在行数等于1的外部查询中过滤掉即可获得所需的输出:

;WITH stat AS (
SELECT CustomerID
, Event
, StartDateTime
, CASE 
    WHEN event = 'check-in' then 1
    WHEN event = 'Transfer' then 2
  ELSE 3
  END  as Ranking
FROM Status
),
q2 as
(
SELECT 
    s.*,
    ROW_NUMBER () over (partition by customerid order by s.ranking) as rn
FROM stat AS s
)
select q2.customerid,
       q2.[event],
       q2.startdatetime,
       l.location,
       f.[description]
 from q2
JOIN Location AS l ON q2.CustomerID = l.CustomerID
JOIN Facility AS f ON q2.CustomerID = f.CustomerID
WHERE q2.rn = 1

嗨!我可以继续在sql中使用您的逻辑。但是,您认为我们是否可以仅使用联接来实现相同的目标。我希望避免使用“WITH”、“ROW_NUMBER”和“PARTITION”,因为当我尝试将其传输到另一个软件QlikView时,它会给我带来问题。谢谢。@sky\u limit,让我看看我能做些什么。我将更新我尝试过的内容。您可以帮助修改它。我正在更新我原来的问题。谢谢,看起来也不错。但现在我想知道QlikView是否允许“案例”。请不要同时删除这两个解决方案。让我再试一件事,我会更新你的。我在我的问题中更新了我的代码。我快到了。如果这样做有效,它将是QlikView最简单的解决方案。非常感谢您抽出时间。
WITH stat AS (
SELECT CustomerID
, Event
, StartDateTime
, ROW_NUMBER() OVER (PARTITION BY CustomerID ORDER BY StartDateTime) as RowN
FROM Status
)
SELECT s.CustomerID, s.Event, s.StartDateTime, l.Location, f.Description
FROM stat AS s
JOIN Location AS l ON s.CustomerID = l.CustomerID
JOIN Facilty AS f ON s.CustomerID = f.CustomerID
WHERE s.RowN = 1
WITH Cte AS(
    SELECT *,
        RN = ROW_NUMBER() OVER(PARTITION BY CustomerID ORDER BY
                                CASE
                                    WHEN Event = 'check-in' THEN 1
                                    ELSE 2
                                END,
                                StartDateTime
                            )
    FROM Status
    WHERE Event IN('check-in', 'Transfer')
)
SELECT
    c.CustomerID, c.Event, c.StartDateTime, l.Location, f.Description
FROM Cte c
INNER JOIN Location l
    ON l.CustomerID = c.CustomerID
INNER JOIN Facility f
    ON f.CustomerID = c.CustomerID
WHERE RN = 1
SELECT
    s.CustomerID,
    CASE WHEN MaxCheckIn IS NOT NULL THEN 'check-in' ELSE 'Transfer' END AS Event,
    CASE WHEN MaxCheckIn IS NOT NULL THEN MaxCheckIn ELSE MaxTransfer END AS StartDateTime,
    l.Location,
    f.Description
FROM (
    SELECT
        CustomerID,
        MAX(CASE WHEN Event = 'check-in' THEN StartDateTime END) AS MaxCheckIn,
        MAX(CASE WHEN Event = 'Transfer' THEN StartDatetime END) AS MaxTransfer
    FROM Status
    WHERE Event IN ('check-in', 'Transfer')
    GROUP BY CustomerID
)s
INNER JOIN Location l
    ON l.CustomerID = s.CustomerID
INNER JOIN Facility f
    ON f.CustomerID = s.CustomerID
;WITH stat AS (
SELECT CustomerID
, Event
, StartDateTime
, CASE 
    WHEN event = 'check-in' then 1
    WHEN event = 'Transfer' then 2
  ELSE 3
  END  as Ranking
FROM Status
),
q2 as
(
SELECT 
    s.*,
    ROW_NUMBER () over (partition by customerid order by s.ranking) as rn
FROM stat AS s
)
select q2.customerid,
       q2.[event],
       q2.startdatetime,
       l.location,
       f.[description]
 from q2
JOIN Location AS l ON q2.CustomerID = l.CustomerID
JOIN Facility AS f ON q2.CustomerID = f.CustomerID
WHERE q2.rn = 1