SQL查询使用两个表

时间:2015-11-30 18:23:56

标签: sql sql-server

我在数据库中有两个表。一个名为Users,一个名为Days。 Users表有一个名为ID的列,其中包含一些数字和一个ActiveUser列,其中包含0(非活动)或1(活动)。 Days表有一个名为UserID的列,其中包含Users表中的ID列所具有的相同编号。它还有一个名为Day的列,其中包含" 2015-01-01 00:00:00:000"等信息。

用户表:

ID   |   ActiveUser
-------------------
10   |   0
11   |   1
12   |   1
13   |   0

天表:

User_ID   |   Day
------------------
10        |   2010-06-24 00:00:00.000   
11        |   2011-07-05 00:00:00.000
12        |   2008-06-19 00:00:00.000
13        |   2010-06-20 00:00:00.000
10        |   2009-09-02 00:00:00.000
12        |   2010-08-15 00:00:00.000
11        |   2011-05-06 00:00:00.000
13        |   2012-04-25 00:00:00.000

我尝试创建一个查询,查找为每个活动用户列出的最近一天。因此,使用上面的表格,我试图制作的查询应该给我以下内容:

Day
------
2011-07-05 00:00:00.000
2010-08-15 00:00:00.000

对应于具有用户ID 11和12的两个活跃用户,这两个用户都有两个Day日期,但查询选择了最近的日期。

我是SQL的新手,我最接近的是,它没有考虑到Users表(也使用https://stackoverflow.com/a/2411703/2480598作为模板):

select Days.Day
from Days
inner join (select User_ID, max(day) as MaxDay
   from Days
   group by User_ID
) tm on Days.User_ID = tm.User_ID and Days.Day = tm.MaxDay

这为我提供了活动和非活动用户的日期列表。

3 个答案:

答案 0 :(得分:2)

Select a.User_ID, max(a.day) as LatestDay from Days a
Inner Join Users b
on a.User_ID = b.ID and b.ActiveUser = 1
group by a.User_ID

inner join仅将其限制为活跃用户。如果您只想要一个天数列表,则可以从a.User_ID中删除select

答案 1 :(得分:1)

您需要join到users表才能获得活跃用户。这是一个简单的方法:

select u.id, max(d.day) as MaxDay
from Days d join
     Users u
     on d.user_id = u.id
where u.ActiveUser = 1
group by u.User_ID;

答案 2 :(得分:1)

这是可以应用APPLY的经典示例:

select * from users u
outer apply(select top 1 day from days where userid = u.id order by day desc)a
where u.ActiveUser = 1

如果您只想要day列(我认为没有意义):

select max(d) as day
from users u
join days d on d.userid = u.id
where u.ActiveUser = 1
group by u.id