首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在另一列中选择id相同但值不同的行- SQL Server

在另一列中选择id相同但值不同的行- SQL Server
EN

Stack Overflow用户
提问于 2019-05-23 03:08:06
回答 1查看 53关注 0票数 0

我有一个表格,显示了正在分析的证据的保管链。证据可能只在一个位置进行分析,但也可以转移到不同的实验室进行分析。我正在尝试编写一个查询,如果在不同的实验室中进行分析,它将返回案例编号。

这是一个数据的例子:DNA1从化学实验室开始,然后转移到CaseNumber实验室,然后转移回化学实验室。案例2仅在化学实验室中关联(不需要在查询结果中看到此案例)。

代码语言:javascript
运行
复制
ID   CaseNumber     Lab        ActionDate   Action
-------------------------------------------------------------------
1     1             Chem       1/1/2019     case created
2     1             Chem       1/2/2019     container created
3     1             DNA        2/1/2019     container routed to DNA
4     1             DNA        2/3/2019     evidence analyzed
5     1             Chem       2/3/2019     edit route
6     2             Chem       2/4/2019     create case
7     2             Chem       2/5/2019     analyze evidence

这是我到目前为止所拥有的。这将返回casenumber和would lab,但我想以某种方式合并ActionDate,以显示它被路由到新位置的实际日期。

代码语言:javascript
运行
复制
SELECT DISTINCT
    casenumber, lab 
FROM 
    summary 
WHERE 
    casenumber IN (SELECT a.casenumber 
                   FROM summary a
                   JOIN summary b on b.casenumber = a.casenumber AND b.lab <> a.lab)
    AND actiondate BETWEEN '2019-01-02' AND '2019-01-04'
ORDER BY
    casenumber

我期望查询的结果如下所示。我希望看到每个实验室的第一个条目(因为那是它实际路由到新位置的日期)

代码语言:javascript
运行
复制
ID   CaseNumber     Lab        ActionDate   Action
-------------------------------------------------------------------
1     1              Chem       1/1/2019    case created
3     1              DNA        2/1/2019    container routed to DNA
5     1              Chem       2/3/2019    container routed to Chem
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 03:44:46

有很多方法可以做到这一点,这里就是其中之一。注意:这只适用于sql server 2012+。

代码语言:javascript
运行
复制
create table #Something
(
    ID int
    , CaseNumber int
    , Lab varchar(10)
    , ActionDate date
    , Action varchar(50)
)

insert #Something values
(1, 1, 'Chem', '1/1/2019', 'case created')
, (2, 1, 'Chem', '1/2/2019', 'container created')
, (3, 1, 'DNA', '2/1/2019', 'container routed to DNA')
, (4, 1, 'DNA', '2/3/2019', 'evidence analyzed')
, (5, 1, 'Chem', '2/3/2019', 'edit route')
, (6, 2, 'Chem', '2/4/2019', 'create case')
, (7, 2, 'Chem', '2/5/2019', 'analyze evidence')
;

with SortedResults as
(
    select s.ID
        , s.CaseNumber
        , s.Lab
        , s.ActionDate
        , Action = case when LAG(Lab, 1) over(partition by CaseNumber order by ActionDate) is null then Action 
            when LAG(Lab, 1) over(partition by CaseNumber order by ActionDate) = Lab then NULL
            else 'container routed to ' + Lab end
    from #Something s
)

select *
from SortedResults
where Action > ''
order by CaseNumber, ActionDate

drop table #Something
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56263436

复制
相关文章

相似问题

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