我有一个区域数据库,上面有一些东西的观察。所以我有一个beginTimestamp和一个endTimestamp。现在,我想要一个特殊时间段的所有观测,+一个额外的单元格,如果这是第一个观察,则布尔值表示为真。
我的表结构如下所示:
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这段时间里有多少只新的‘羊角’鸟在哪里?
在这种情况下,一个新的和一个‘已知’。
这样的事情可能吗?怎么可能?
发布于 2014-04-04 07:43:02
下面是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我们识别了第一次在左侧联接中看到“已知”的鸟,我们使用一个CASE语句来附加额外的列,指示它是否是第一次被看到。
为了便于阅读,我使用了“True”和“False”,但通常我会使用1和0分别表示真假。
-=编辑=-
在更新问题之后,可以使用以下方法在指定日期范围内获取每只鸟的计数:
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发布于 2014-04-04 07:45:22
您可以使用此逻辑,要获得清晰的图片,请检查SQL Fiddle。
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 oldRecshttps://stackoverflow.com/questions/22855532
复制相似问题