连接表然后在Max Date上过滤

时间:2014-12-04 15:56:04

标签: sql sql-server join maxdate

我想知道是否有人可以将注意力集中在我试图执行的查询上,我无法想到最好的方法。

我需要Contact表中的Email,Firstname和Surname以及热线表中的HotlineID和Last Action。我想过滤存储在热线表中的'flag'列,只显示值为1的行。我通过此查询实现了这一点:

select Email, FirstName, Surname, HotlineID, LastAction 
from Hotline 
left join contact on contact.companyid=hotline.CompanyID 
                 and contact.ContactID=hotline.ContactID 
where
hotline.Flag = 1

现在我不能这样做。在“操作表”中,有3列“HotlineID”“注释”“日期”,“操作表”中的热线ID链接到热线表中的热线ID。可以为每条热线添加多条评论,并将其发布日期记录在日期列中。

在第一个查询的返回行中,我想进一步过滤掉最大日期(最后记录的评论)比当前日期晚48小时的任何行。我在visual studio中使用'addwithvalue'来填充日期变量,但出于测试目的,我使用'2014-12-04'

我想出了这个,但失败了。但我不确定为什么?

Select Email, FirstName, Surname, hotline.HotlineID, LastAction 
from Hotline
left join Contact on Contact.CompanyID=Hotline.CompanyID 
                 and Contact.ContactID=Hotline.ContactID 
inner join Actions on actions.HotlineID=hotline.HotlineID 
where hotline.flag=1 and CONVERT(VARCHAR(25), Max(Date), 126) LIKE '2014-12-03%'

我正在使用SQL Server。

3 个答案:

答案 0 :(得分:1)

MAX()是一组行的聚合函数。如果它出现在选择列表中,它的使用会将您的普通查询转换为聚合查询,这似乎不是您想要的。显然,SQL Server根本不会在你的where子句中接受它。

看起来你想要这样的东西:

SELECT
  Contact.Email,
  Contact.FirstName,
  Contact.Surname,
  recent.HotlineID,
  Hotline.Action
FROM
  (SELECT HotlineID, MAX([Date]) as maxDate
    FROM Hotline
    GROUP BY HotlineID) recent
  INNER JOIN Hotline
    ON recent.HotlineId = Hotline.HotlineId
  LEFT JOIN Contact
    ON Hotline.HotlineId = Contact.HotlineId
WHERE
  datediff(hour, recent.maxDate, GetDate()) < 48
  AND Hotline.Flag = 1

可能您希望将WHERE子句放在子查询中。结果查询的含义与上面的查询略有不同,我不确定你真正想要的是什么。

答案 1 :(得分:0)

你可以试试这个

Select Email, FirstName, Surname, hotline.HotlineID, LastAction 
from Hotline
left join Contact on Contact.CompanyID=Hotline.CompanyID 
                 and Contact.ContactID=Hotline.ContactID 
inner join Actions on actions.HotlineID=hotline.HotlineID 
where hotline.flag=1 
  and CONVERT(VARCHAR(25), Max(Date), 126) < CONVERT(VARCHAR(25), GetDate() - 2, 126) 

答案 2 :(得分:0)

John的查询在使用派生表中的Hotlines表而不是Actions表之外是好的。

SELECT Email, FirstName, Surname, HotlineID, LastAction 
FROM Hotline h
INNER JOIN
(SELECT hotlineID, max(date) as Date FROM actions a1 GROUP BY hotlineID) a
ON h.hotlineID = a.hotlineID
LEFT JOIN contact c 
ON c.companyid=h.CompanyID and c.ContactID=h.ContactID          
WHERE
hotline.Flag = 1 
and datediff(hour,[Date],getdate()) > 48