2014-12-09 76 views
0

我有一个数据库表如下。需要帮助从数据示例创建SQL查询

database table

而且我想这都DBKEY的列表:与变得陈旧= 1的至少一个项目,最后一项是变得陈旧= 0

清单不应包含有DBKEY只有Staled = 0或Staled = 1。

在这个例子中,该列表将是:DBKEY = 2和DBKEY = 3

+1

StackOverflow鼓励你向我们展示你试过的东西以及你的问题。如果这个标准不符合,你的问题一般会被降低。所以,我建议你也在编写查询时加入你的尝试。 – 2014-12-09 11:54:47

回答

1

我想这应该做的伎俩:

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来查找您描述的那些个别条件。我已经在我的代码中添加了注释,以解释每个代码的作用。

+0

谢谢。 SQL查询起作用,我得到了正确的列表。特别是,对于学习目的而言,这是很好的理解。 – ewlung 2014-12-09 12:34:10

+0

@ewlung嗯,这是StackOverflow的目的。祝你下次好运。 – 2014-12-09 12:34:55

0

也许这:

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

应该与做一个简单的加入...任何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) 
+0

@Jānis,好点...给它添加了HAVING子句。 – DRapp 2014-12-09 12:28:05

+0

仍然不会使用'HAVING'子句。只是[**看这里**](http://sqlfiddle.com/#!3/4274f/2) – 2014-12-09 12:28:37

+0

@RaduGheorghiu,不工作SQL错误,或不工作错误的结果。 – DRapp 2014-12-09 12:30:33