让我说实话,我是Java开发人员分配这个SQL开发工作,我需要列出所有的orderIdnodeName'Delay'和id"马克斯(id)">
节点名使用相关子查询检查每个orderId
的最后一个id
是否有nodeName = 'Delay'
:
SELECT DISTINCT t1.orderId
FROM tablename t1
WHERE t1.nodeName = 'Delay'
AND t1.id = (SELECT MAX(t2.id) FROM tablename t2 WHERE t2.orderId = t1.orderId)
或:
SELECT DISTINCT t1.orderId
FROM tablename t1
WHERE 'Delay' = (
SELECT t2.nodeName
FROM tablename t2
WHERE t2.orderId = t1.orderId
ORDER BY id DESC LIMIT 1
)
或,带ROW_NUMBER()
窗函数:
SELECT orderId
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY orderId ORDER BY id DESC) rn
FROM tablename
) t
WHERE rn = 1 AND nodeName = 'Delay'
一种方法是使用我需要列出所有具有nodeName 'Delay'和id为'MAX(id)'的orderId
having
子句进行聚合:
select orderid
from t
group by orderid
having max(id) = max(case when nodename = 'Delay' then id end);
或者,如果您确实使用相关子查询,则会想到not exists
:
select orderid
from t
where t.nodename = 'Delay' and
not exists (select 1
from t t2
where t2.orderid = t.orderid and
t2.nodename <> 'Delay' and
t2.id > t.id
);
假设您只搜索一行,试一试:
SELECT MAX(id), orderId, nodeName
FROM table_name
WHERE nodeName = 'Delay';
如果您不是只搜索一行,而是搜索具有最高id的结果,
试题:
SELECT *
FROM table_name
WHERE nodeName = 'Delay'
ORDER BY id DESC
LIMIT 5;
您可以使用以下查询
select t1.orderId
from tablename t1
join (SELECT MAX(id) as id FROM tablename group by orderId) t2 on t1.id = t2.id
where t1.nodeName = 'Delay'