首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不需要额外记录的查询

不需要额外记录的查询
EN

Stack Overflow用户
提问于 2021-06-02 04:07:18
回答 2查看 33关注 0票数 0

我在Business Objects中查询时遇到问题。我的表包含由id、客户端、状态和日期标识的事件记录。一个客户端可以有两个状态open和close,如下所示

客户端1的select with duplicate注册表是

代码语言:javascript
复制
SELECT T1.ID, T1.CLIENT, T1.DATE AS DATE_OPEN,
CASE WHEN T2.STATE = 'CLOSE' THEN T2.DATE END AS DATE_CLOSE 
FROM MYTABLE T1 
inner join MYTABLE T2 
  on (T1.CLIENT = T2.CLIENT)
where T1.STATE='OPEN' AND T2.STATE IN ('OPEN','CLOSE');

您能帮我在没有ID=111的情况下实现查询吗?

EN

回答 2

Stack Overflow用户

发布于 2021-06-02 04:24:14

我相信你想要这样的东西:

代码语言:javascript
复制
SELECT T1.ID, T1.CLIENT, T1.DATE AS DATE_OPEN,
    CASE WHEN T2.STATE = 'CLOSE' THEN T2.DATE END AS DATE_CLOSE 
FROM MYTABLE T1 
LEFT OUTER JOIN MYTABLE T2 
  ON (T1.CLIENT = T2.CLIENT)
  AND t2.state = 'CLOSE'
WHERE T1.STATE='OPEN';

请注意,这将“删除”333ID行,但111ID行应该像我相信您正在寻找的那样填充DATE_CLOSE。如果您确实需要删除第111行,可以在select中用CASE WHEN T2.STATE='CLOSE' THEN T2.ID ELSE T1.ID END AS ID替换T1.ID

我在这里做了几个假设,包括:

  • 您显示的表是您当前正在获取的输出(并且每个客户端只需要一行)
  • 您的数据模型中的每个“

”都有一行: ID,CLIENT,DATE,

票数 1
EN

Stack Overflow用户

发布于 2021-06-02 05:33:51

我想你只是想要一个这样的left join

代码语言:javascript
复制
SELECT T1.ID, T1.CLIENT, T1.DATE AS DATE_OPEN,
       T2.DATE AS DATE_CLOSE 
FROM MYTABLE T1 LEFT JOIN
     MYTABLE T2 
     ON T1.CLIENT = T2.CLIENT AND t2.STATE = 'Close'
WHERE T1.STATE = 'OPEN' ;

也就是说,我可能还会建议聚合:

代码语言:javascript
复制
select min(id), client, min(date) as date_open,
       nullif(max(date), min(date)) as date_close
from mytable t
group by client;

这假设打开日期早于关闭日期。它还假设较小的id是用于开放的。这两种情况都可以使用条件逻辑来处理,但这种逻辑似乎没有必要。

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

https://stackoverflow.com/questions/67795401

复制
相关文章

相似问题

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