我知道这听起来有点奇怪,但我不知道如何在没有示例的情况下更好地解释这一点。
我有下表
ID contract_id status_id created
1 1 1 2015-10-14
2 1 2 2015-10-15
3 1 1 2016-02-02
4 1 4 2017-03-01
如果查询类似于 SELECT * FROM表WHERE status_id = 1并创建BETWEEN 2015-10-10和2017-03-05 不应显示contract_id = 1的项目,因为该日期间隔中的最新状态为4 但如果查询是这样的 SELECT * FROM表WHERE status_id = 1并创建BETWEEN 2015-10-10 AND 2017-02-28带有contract_id 1的项应该显示,因为最新的status_id = 1
基本上我需要的是这样的:如果在结束日期status_id = 1,请给我最新的项目
我知道这很简单但我现在绕圈跑来跑去。我确实尝试了abs(datediff(结束,开始)),选择基于if或select in select但我没有得到我正在寻找的结果。
非常感谢你的帮助。
答案 0 :(得分:0)
Oracle:
if (string.IsNullOrEmpty(path))
sPolPath = false;
else
sPolPath = Path.GetPathRoot(path).Length < 2;
MySQL:
SELECT * FROM table WHERE status_id = 1 AND created BETWEEN 2015-10-10 AND 2017-03-05 AND ROWNUM <=1 ORDER BY created desc
SQL Server:
SELECT * FROM table WHERE status_id = 1 AND created BETWEEN 2015-10-10 AND 2017-03-05 ORDER BY created desc LIMIT 1
我理解你的问题是你想要一个status_id = 1并且最近创建日期的项目
答案 1 :(得分:0)
其中一种方法是使用给定contract_id具有所需状态的最新日期的INNER JOIN,并测试日期是否早于边界日期:
编辑:在进一步阅读评论后,很可能这个评论将完全符合您的需求
SELECT t.*
FROM statuses AS t
INNER JOIN (
SELECT max(id) AS lastid, max(created) AS lastdate
FROM statuses
WHERE status_id = 1 AND created < '2016-01-01'
GROUP BY contract_id
) AS latest ON t.ID = latest.lastid
请注意,只有在按时间顺序排列日期时才会起作用,换句话说就是每个contract_id的日期:ID'&lt; ID''≡create'&lt;创建 ''