我在数据库中有两个表。一个名为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
这为我提供了活动和非活动用户的日期列表。
答案 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