首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有附加信息的SQL查询

带有附加信息的SQL查询
EN

Stack Overflow用户
提问于 2014-04-04 06:48:36
回答 2查看 43关注 0票数 0

我有一个区域数据库,上面有一些东西的观察。所以我有一个beginTimestamp和一个endTimestamp。现在,我想要一个特殊时间段的所有观测,+一个额外的单元格,如果这是第一个观察,则布尔值表示为真。

我的表结构如下所示:

代码语言:javascript
运行
复制
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这段时间里有多少只新的‘羊角’鸟在哪里?

在这种情况下,一个新的和一个‘已知’。

这样的事情可能吗?怎么可能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-04 07:43:02

下面是Server的一个示例:

代码语言:javascript
运行
复制
 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分别表示真假。

-=编辑=-

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

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-04-04 07:45:22

您可以使用此逻辑,要获得清晰的图片,请检查SQL Fiddle

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22855532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档