我有一个数据库表如下。需要帮助从数据示例创建SQL查询
而且我想这都DBKEY的列表:与变得陈旧= 1的至少一个项目,最后一项是变得陈旧= 0
清单不应包含有DBKEY只有Staled = 0或Staled = 1。
在这个例子中,该列表将是:DBKEY = 2和DBKEY = 3
我有一个数据库表如下。需要帮助从数据示例创建SQL查询
而且我想这都DBKEY的列表:与变得陈旧= 1的至少一个项目,最后一项是变得陈旧= 0
清单不应包含有DBKEY只有Staled = 0或Staled = 1。
在这个例子中,该列表将是:DBKEY = 2和DBKEY = 3
我想这应该做的伎俩:
SELECT DISTINCT T.DBKey
FROM TABLE T
WHERE
-- checks that the DBKey has at least one entry with Staled = 1
EXISTS (
SELECT DISTINCT Staled
FROM TABLE
WHERE DBKey = T.DBKey
AND Staled = 1
)
-- checks that the last Staled entry for this DBKey is 0
AND EXISTS (
SELECT DISTINCT Staled
FROM TABLE
WHERE DBKey = T.DBKey
AND Staled = 0
AND EntryDateTime = (
SELECT MAX(EntryDateTime)
FROM TABLE
WHERE DBKey = T.DBKey
)
)
这里是工作的查询SQLFiddle,使用您的样本数据。
这个想法是使用EXISTS
来查找您描述的那些个别条件。我已经在我的代码中添加了注释,以解释每个代码的作用。
谢谢。 SQL查询起作用,我得到了正确的列表。特别是,对于学习目的而言,这是很好的理解。 – ewlung 2014-12-09 12:34:10
@ewlung嗯,这是StackOverflow的目的。祝你下次好运。 – 2014-12-09 12:34:55
也许这:
With X as
(
Select Row_Number() Over (Partition By DBKey Order By EntryDateTime Desc) RN, DBKey, Staled
From table
)
Select *
From X
Where rn = 1 and staled = 0 and
Exists (select 1 from x x2 where x2.dbkey = x.dbkey and Staled = 1)
应该与做一个简单的加入...任何1场预选赛第一起步,加盟商本身相同的密钥和0变得陈旧预选赛和0的记录具有更高的日期。确保你有一个索引(DBKey,Staled,EntryDateTime)
SELECT
YT.DBKey,
MAX(YT.EntryDateTime) as MaxStaled1,
MAX(YT2.EntryDateTime) as MaxStaled0
from
YourTable YT
JOIN YourTable YT2
ON YT.DBKey = YT2.DBKey
AND YT2.Staled = 0
AND YT.EntryDateTime < YT2.EntryDateTime
where
YT.Staled = 1
group by
YT.DBKey
having
MAX(YT.EntryDateTime) < MAX(YT2.EntryDateTime)
StackOverflow鼓励你向我们展示你试过的东西以及你的问题。如果这个标准不符合,你的问题一般会被降低。所以,我建议你也在编写查询时加入你的尝试。 – 2014-12-09 11:54:47