Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有附加信息的SQL查询_Sql - Fatal编程技术网

带有附加信息的SQL查询

带有附加信息的SQL查询,sql,Sql,我有一个RDB,上面有一些观察到的东西。所以我有一个beginTimestamp和一个endTimestamp。现在我想要一个特殊时间段的所有观测值+一个额外的单元格,如果它是第一个观测值,则布尔值为true 我的表结构如下所示: ID | Bird | beginTimestamp | endTimestamp ******************************************** 101 | 125 | 3.4.2014 12:30 | 3.4.2014 12:33 /

我有一个RDB,上面有一些观察到的东西。所以我有一个beginTimestamp和一个endTimestamp。现在我想要一个特殊时间段的所有观测值+一个额外的单元格,如果它是第一个观测值,则布尔值为true

我的表结构如下所示:

ID  | Bird | beginTimestamp | endTimestamp
********************************************
101 | 125  | 3.4.2014 12:30 | 3.4.2014 12:33 //first Observation of this bird
102 | 125  | 3.4.2014 14:15 | 3.4.2014 14:27 //second Observation of this bird
103 | 126  | 3.4.2014 12:31 | 3.4.2014 12:45 //5th Observation of this bird
所以现在我想知道在3.4.2014 12:31-3.4.2014 12:32这段时间里,那里有多少新的和“knwon”鸟

在这种情况下,1个是新的,1个是已知的


这种情况是否可能以及如何实现?

下面是SQL Server的一个示例:

 SELECT O.Bird, O.beginTimestamp, O.endTimestamp,
        CASE
            WHEN FS.firstSeenTimestamp = O.beginTimestamp THEN 'True'
            ELSE 'False'
        END AS IsFirstTimeSeen
   FROM Observations AS O
        LEFT JOIN
        (
        -- Identify first instance of each bird being seen
         SELECT Bird, MIN(beginTimestamp) AS firstSeenTimestamp
           FROM Observations
          GROUP BY Bird
        ) AS FS
        ON FS.Bird = O.Bird
我们确定第一次在左连接中看到已知的bird,并使用CASE语句附加额外的列,指示它是否是第一次被看到

为了便于阅读,我使用了'True'和'False',但通常我会使用1和0分别表示True和False

-=编辑=-

更新问题后,您可以使用以下方法获取指定日期范围内每只鸟的计数:

DECLARE @RangeStart DATETIME
DECLARE @RangeEnd DATETIME
SET @RangeStart = '2014-04-03T00:00:00'
SET @RangeEnd = '2014-04-03T23:59:59'

 SELECT O.Bird,
        SUM (CASE
            WHEN O.beginTimestamp = FS.firstSeenTimestamp THEN 1
            ELSE 0
        END) AS CountOfFirstSeen,
        SUM (CASE
            WHEN O.beginTimestamp > FS.firstSeenTimestamp THEN 1
            ELSE 0
        END) AS CountOfSeenAgain
   FROM Observations AS O
        LEFT JOIN
        (
        -- Identify first instance of each bird being seen
         SELECT Bird, MIN(beginTimestamp) AS firstSeenTimestamp
           FROM Observations
          GROUP BY Bird
        ) AS FS
        ON FS.Bird = O.Bird
  WHERE O.beginTimestamp BETWEEN @RangeStart AND @RangeEnd
  GROUP BY O.Bird

您可以使用这个逻辑,为了清晰的图片,请检查


你说的特殊时期是什么意思?你能给我们看一下你的数据库/表格结构吗?那么“已知”是一个有重复记录的ID吗?没有sry我已经编辑过了。首先非常感谢你的回答。起初,我认为我可以计算Java中的new和knwon,但通过您的查询,我认为我还可以计算SQL查询中的1和0,以便在SQL语法中获得正确的结果。因此,我认为我可以使用类似@AK47s fiddle的模式和您的查询:。如果可能的话,你能实现我在之前的评论中提到的计数功能吗?因为我觉得在一个小时的尝试后,我觉得我在这方面太傻了。你知道嵌入式Derby DB是否可以做到这一点吗?如果你添加预期结果,你会得到更准确的答案。我非常感谢你,你帮了我很多!
select a.*, 'Observation no ' + Cast(oldRecs.beforThis as Varchar(10))  + ' for this bird'  from joborder as a
outer apply
    (
        select COUNT(jo_no) + 1 as beforThis from joborder as b
        where b.jo_no < a.jo_no
            and b.jo_status = a.jo_status
    )as oldRecs