下表的SQL查询

问题描述 投票:0回答:3

我正在尝试编写查询以获取以下结果

期望结果在下表中

HouseName   Address        CurrentResident
------------------------------------------
A           1 Market St    Smith
B           2 Market St    Einstein
X           3 Market St    [Vacant]
D           4 Market St    [Vacant]

请帮助

表的SQL查询

CREATE TABLE House 
( 
     HouseName Varchar(1), 
     Address Varchar(255)
);

CREATE TABLE Events 
(
    Id Integer, 
    HouseName Varchar(1), 
    EventName Varchar(255), 
    Date Date, 
    Family Varchar(255)
);

INSERT House VALUES('A', '1 Market St');
INSERT House VALUES('B', '2 Market St');
INSERT House VALUES('X', '3 Market St');
INSERT House VALUES('D', '4 Market St');

INSERT Events VALUES(1,'A','MoveIn','2005-01-31','Smith');
INSERT Events VALUES(2,'A','Remodel','2005-03-31','Smith');
INSERT Events VALUES(3,'A','Remodel','2008-03-31','Smith');
INSERT Events VALUES(4,'A','CleanUp','2008-05-31','Smith');
INSERT Events VALUES(5,'B','MoveIn','2005-01-31','Newton');
INSERT Events VALUES(6,'B','MoveOut','2008-05-01','Newton');
INSERT Events VALUES(7,'B','MoveIn','2008-12-01','Einstein');
INSERT Events VALUES(8,'D','MoveIn','2007-08-31','Soo');
INSERT Events VALUES(9,'D','MoveOut','2010-08-13','Soo');

两个结果表如下

HouseName   Address
    A   1 Market St
    B   2 Market St
    X   3 Market St
    D   4 Market St

事件

   Id   HouseName   EventName   Date    Family
    1   A             MoveIn    2005-01-31  Smith
    2   A            Remodel    2005-03-31  Smith
    3   A            Remodel    2008-03-31  Smith
    4   A            CleanUp    2008-05-31  Smith
    5   B             MoveIn    2005-01-31  Newton
    6   B            MoveOut    2008-05-01  Newton
    7   B             MoveIn    2008-12-01  Einstein
    8   D             MoveIn    2007-08-31  Musk
    9   D             MoveOut   2010-08-13  Musk

因此,对于房屋d,有迁入和迁出,但之后没有记录的迁入,因此它应该显示为空置

我的代码

SELECT HouseName, Address, currentresident  
FROM (SELECT h.*, COALESCE(e.Family, 'Vacant') AS currentresident, 
        ROW_NUMBER()OVER(PARTITION BY h.HouseName ORDER BY e.Date desc) AS rn       
       FROM House AS h left JOIN Events AS e ON h.HouseName=e.HouseName) 
AS t     WHERE t.rn=1
sql
3个回答
0
投票

这是在较大的数据库上可以尝试的东西。

SELECT HouseName, Address, currentresident  
FROM (SELECT h.*,
        Case When e.EventName = 'MoveOut' Then 'Vacant' 
             Else COALESCE(e.Family, 'Vacant') End AS currentresident, 
        ROW_NUMBER()OVER(PARTITION BY h.HouseName ORDER BY e.Date desc) AS rn       
       FROM xyzHouse AS h left JOIN xyzEvents AS e ON h.HouseName=e.HouseName) 
AS t     WHERE t.rn=1

0
投票
select H.HouseName, H.Address, 
Case When ISNULL(e.EventName,'MoveOut')='MoveOut' then'[Vacant]'
      Else e.Family end as CurrentResident 
from House h
left join Events e on e.id = 
  (
      select max(e2.id) from events e2 
      where e2.housename = h.housename and e2.EventName in ('MoveIn','MoveOut')
  )

0
投票
SELECT HouseName, Address, currentresident  
FROM (SELECT h.*, COALESCE(case when e.EventName='MoveOut' then null else e.Family end, 'Vacant') AS currentresident, 
        ROW_NUMBER()OVER(PARTITION BY h.HouseName ORDER BY e.Date desc) AS rn       
       FROM House AS h left JOIN Events AS e ON h.HouseName=e.HouseName) 
AS t     WHERE t.rn=1
© www.soinside.com 2019 - 2024. All rights reserved.