首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL查询返回包含表中其他信息的最新日期。

SQL查询返回包含表中其他信息的最新日期。
EN

Stack Overflow用户
提问于 2014-05-05 20:54:06
回答 3查看 87关注 0票数 1

我有5个与此查询相关的表和列:

  • 狗(ID,CallName,颜色,性别,Chipnumber,BreedID)
  • 品种(ID,名称)
  • 状态(ID、状态、OwnedOnPremises)
  • DogsStatus (ID,DogsID,StatusID,StatusDate,Note,ContactsID)
  • 联系人(ID,姓名)

我想知道所有的狗和它们的最新状况。为了进行测试,我使用以下记录:

  • 狗(251号,坦克,福恩,M,14410784,23) (266个,邦妮,布林德尔,14964070,23)
  • 品种(23,Mastiff)
  • 状况(3,出售) (4,赠予) (7,购买) (9,退回)
  • DogsStatus (29,251,3,2013年-10-12,5) (39,251,9,2013-11-10,17) (146,251,4,2014-01-10,7) (40,266,7,2013年-10-30,1)
  • 联系人(1,Person1) (5,Person5) (7,Person7) (17,Person17)

到目前为止,我已经:

代码语言:javascript
运行
复制
SELECT 
    d.CallName, b.Name AS 'Breed', d.Color, d.Sex, d.ChipNumber
FROM 
    Dogs d
JOIN 
   (SELECT 
        DogsID, MAX(StatusDate) as MaxStatusDate 
    FROM DogsStatus 
    GROUP BY DogsID) mds ON mds.DogsID = d.ID
JOIN 
   Breeds b ON b.ID = d.BreedID

这将返回两个独特的记录(一个坦克和邦尼一个),但每当我试图获得任何其他的DogsStatus和/或状态信息,我要么只返回一个狗记录,或全部3个坦克DogsStatus记录。

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-05 20:58:57

您需要将MaxStatusDate加入到DogsStatus表中。这样,您将只获得最近的状态,在有多个状态的情况下。有点像

代码语言:javascript
运行
复制
SELECT 
    d.CallName, b.Name AS 'Breed', d.Color, d.Sex, d.ChipNumber
FROM 
    Dogs d
innner join DogsStatus ds
  ON d.dogsid = ds.dogs_id
JOIN 
   (SELECT 
        DogsID, MAX(StatusDate) as MaxStatusDate 
    FROM DogsStatus 
    GROUP BY DogsID) mds ON mds.DogsID = d.ID
JOIN 
   Breeds b ON b.ID = d.BreedID
   AND mds.maxstatusdate = ds.statusdate

一些类似的东西。

票数 1
EN

Stack Overflow用户

发布于 2014-05-05 21:08:06

你离我很近。您只需要返回到DogStatus表就可以得到完整的记录。请注意,在这方面我更喜欢CTE,但是您现有的派生表(子查询)方法也很好:

代码语言:javascript
运行
复制
With StatusDates As
(

    SELECT 
        DogsID, MAX(StatusDate) as StatusDate 
    FROM DogsStatus 
    GROUP BY DogsID
), CurrentStatus As 
(
    SELECT ds.*
    FROM DogStatus ds
    INNER JOIN StatusDates sd ON sd.DogsID = ds.DogsID AND ds.StatusDate = sd.StatusDate
)
SELECT d.Name, b.Name As Breed, d.Color, d.Sex, d.ChipNumber
    , s.Status, cs.StatusDate, c.Name As ContactName
FROM Dogs d
INNER JOIN CurrentStatus cs ON cs.DogsID = d.ID
INNER JOIN Breed b on b.ID = d.BreedID
INNER JOIN Status s on s.ID = cs.StatusID
INNER JOIN Contact c on c.ID = cs.ContactID

您可能希望对其中一些操作使用左联接,然后更改select列表以使用coalesce()表达式来清除NULL。

票数 0
EN

Stack Overflow用户

发布于 2014-05-05 21:08:13

它会是这样的,我相信你能适应你的需求:

代码语言:javascript
运行
复制
;with x as (
  select *, row_number() over(partition by d.DogsId order by StatusDate desc) as rn
  from Dogs d
  inner join DogsStatus on d.DogsId = ds.DogsId
)
select *
from x
where rn = 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23481686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档