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

客户端1的select with duplicate注册表是
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的情况下实现查询吗?
发布于 2021-06-02 04:24:14
我相信你想要这样的东西:
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,
发布于 2021-06-02 05:33:51
我想你只是想要一个这样的left join:
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' ;也就是说,我可能还会建议聚合:
select min(id), client, min(date) as date_open,
nullif(max(date), min(date)) as date_close
from mytable t
group by client;这假设打开日期早于关闭日期。它还假设较小的id是用于开放的。这两种情况都可以使用条件逻辑来处理,但这种逻辑似乎没有必要。
https://stackoverflow.com/questions/67795401
复制相似问题