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