本文探讨了如何通过SQL查询获取每个服务的每个节点或指定服务在特定节点的最新状态记录。当查询结果为空时,通过修改SELECT语句,确保返回空结果而不是表名。涉及的SQL技巧包括子查询和聚合函数MAX()用于获取最大时间戳。 摘要由CSDN通过智能技术生成

表字段如下:

表记录了每个服务(server_id)的不同节点(node_id)的不同时间(create_time)的状态记录

CREATE TABLE public.server_status (
    id varchar(255) NOT NULL,
    creat_time timestamp NULL,
    is_online varchar(255) NOT NULL,
    msg varchar(255) NULL,
    node_id varchar(255) NOT NULL,
    online_update_time timestamp NULL,
    server_id varchar(255) NOT NULL,
    server_level varchar(255) NULL,
    user_identify varchar(255) NOT NULL,
    CONSTRAINT xviid_server_status_pkey PRIMARY KEY (id)

现在要根据node_id和server_id查询最新的记录时间:

查询每个服务的每个节点的最新记录。

select x 
from xviid_server_status x, 
     (select server_id,node_id, max(creat_time) creat_time from xviid_server_status group by server_id, node_id) s
where x.server_id = s.server_id and x.node_id = s.node_id and x.creat_time = s.creat_time

查询指定服务在每个节点的最新记录:

select x 
from xviid_server_status x, 
     (select server_id,node_id, max(creat_time) creat_time from xviid_server_status where server_id='aaaaa' group by server_id, node_id) s
where x.server_id = s.server_id and x.node_id = s.node_id and x.creat_time = s.creat_time

查询指定服务在指定节点的最新记录:

select x 
from xviid_server_status x, 
     (select server_id,node_id, max(creat_time) creat_time from xviid_server_status where server_id='aaaaa' and node_id='bbbbb' group by server_id, node_id) s
where x.server_id = s.server_id and x.node_id = s.node_id and x.creat_time = s.creat_time

以上的语句在数据库可以查询出数据的情况下没有任何问题。但是当语句查询结果为空时,就会直接返回表的引用名称 x

需要改select x select x*。才能在查询结果为空时,返回空。

查询每个服务的每个节点的最新记录。

select x.* 
from xviid_server_status x, 
     (select server_id,node_id, max(creat_time) creat_time from xviid_server_status group by server_id, node_id) s
where x.server_id = s.server_id and x.node_id = s.node_id and x.creat_time = s.creat_time

查询指定服务在每个节点的最新记录:

select x.*
from xviid_server_status x, 
     (select server_id,node_id, max(creat_time) creat_time from xviid_server_status where server_id='aaaaa' group by server_id, node_id) s
where x.server_id = s.server_id and x.node_id = s.node_id and x.creat_time = s.creat_time

查询指定服务在指定节点的最新记录:

select x.*
from xviid_server_status x, 
     (select server_id,node_id, max(creat_time) creat_time from xviid_server_status where server_id='aaaaa' and node_id='bbbbb' group by server_id, node_id) s
where x.server_id = s.server_id and x.node_id = s.node_id and x.creat_time = s.creat_time
FROM 名; 说明:SELECT关键字后的字段名可换成*,*代查询数据中的所有(字段)的内容。 所有SELECT语句必须有SELECT子句和FROM子句,书写时可以将两个字句写在一行中。 主要子句的语法 --查询时间最大值 select create_by, isnull((select max(create_time) from a_task_carry),'') 最大时间, create_time from a_task_carry --查询数据 select task_id,repairs_id,pra_completion_date, isnull((select max(accomplish_time) from as_task where as_repairs.repairs_id = as_task.repairs_id),'') from as_repairs where repairs select (case when c.a>c.b then c.a else c.b end) as MaxTime from (SELECT MAX(字段1) as a ,MAX(字段2) as b FROM [] ) as c 执行完成之后得到最大的值 转载于:https://www.cnblogs.com/cfss...
DateTable.Select()中查找datetime为空的数据 在网上找了好久,也试了很多,一直都是空,好不容易才成功的运行了,记录一下。 解释一下,就是数据库的数据类型是datetime,数据为null,我要查找到这个数据。 从数据库中查找到该,保存到DateTable中,用select()经行筛选。 thedate是这个格中对应时间的这一列的列名。 DateRow[] rows = myDateTable.Select( $"thedate is NULL" ); 两个,投递记录和封发开拆记录,现在想知道投递日期距最后一次封发日期天数分布情况。 对这个需求,需要先查询出投递明细,同时要知道对应的邮件最后一次封发情况,如机构、日期等 2、明细查询 考虑到一天可能封发多次,所以取日期和时间都是最大的那条,语句如下: select * from tb_evt_bag_mail_rel