【问题标题】:SQL query to find most recent date using two tables使用两个表查找最近日期的 SQL 查询
【发布时间】:2016-03-04 11:43:51
【问题描述】:

我在一个数据库中有两个表。一个叫用户,一个叫天。 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 的两个 Active 用户,这两个用户都有两个 Day 条目,但查询选择了最近的日期。

我是 SQL 新手,我得到的最接近的是下面,它没有考虑用户表(也使用 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

这给了我活跃和非活跃用户的日期列表。

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • 微软 SQL 服务器。更新了标签以反映这一点,对此感到抱歉。标题也错了。

标签: sql sql-server


【解决方案1】:
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 仅限于活跃用户。如果您只需要日期列表,则可以从 select 中删除 a.User_ID

【讨论】:

  • 试过这个。我不断收到一条错误消息,提示“无效的列名 'Day'”,这肯定不是无效的列。
  • 这个应该是a.day
  • 感谢@GiorgiNakeuri - 已修复。
【解决方案2】:

您需要 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;

【讨论】:

  • 嗯,我在第 6 行的“where”附近遇到语法错误。我更改了名称和所有名称以匹配我的表,但仍然是同样的问题。
  • @Gordon,有一个小错误。只需将where 子句放在order by 子句之前。
【解决方案3】:

这是可以应用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

【讨论】:

  • 这行得通,我将不得不更多地研究 apply 的作用。我只想要日期列的原因是我在 C# 中的一些代码只是将日期用于某些任务。
猜你喜欢
  • 1970-01-01
  • 2018-07-25
  • 2017-06-13
  • 2023-03-31
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多