sql 查询每条记录,并增加一个字段,根据查询小于时间节点(timenode)的个数,该如何实现?

发布于 2022-09-12 03:16:32 字数 398 浏览 18 评论 0

20200617105450.png
QMqueuing表中有个timenode字段,
timenode用来记录司机入队列的时间,所以可以根据
举例:
SELECT count(1) from QMqueuing where timenode< 1591950907300
查询出司机在此1591950907300时间节点入列时,队列中前面还有几位.

上图,我想曾加一个列,用来记录每个司机在队列中前面都还有几位司机.
最后大概显示如下image.png

请问sql语句该如何写?还请指教一下!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

海风掠过北极光 2022-09-19 03:16:32

首先,没看懂你的问题到底要问什么,建议把建表的sql也放出来。
然后,我连蒙带猜,如果想要第二张截图的结果的话,那么先把你图一中的SQL中,

  1. 中文字符串全加上引号,
  2. “序号”前面的整个函数加上括号,
  3. “当前司机前面还有几位”前面的子查询也加上括号

试一下。
———————————————————————————————
追答,
想了一下,因为有逻辑处理在里面,用纯SQL很难处理,又不能放到代码处理这些逻辑,那吧这些逻辑放到存储过程中,用存储过程来处理。

如果题主的表里确实需要那个统计字段的话,可以像我一样,直接更新这个字段,如果不要,可以创建一个临时表,然后left join两张表。

ps: 没用过SqlServer,用mysql写的,题主看着理解一下意思,自己写一个SqlServer的

-- 创建表
CREATE TABLE `t_test` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `time` datetime DEFAULT NULL,
  `num` int(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

-- 插入数据
INSERT INTO `test、`.`t_test`(`id`, `time`, `num`) VALUES (1, '2020-06-01 10:34:54', NULL);
INSERT INTO `test、`.`t_test`(`id`, `time`, `num`) VALUES (2, '2020-06-02 10:35:07', NULL);
INSERT INTO `test、`.`t_test`(`id`, `time`, `num`) VALUES (3, '2020-06-03 10:35:15', NULL);
INSERT INTO `test、`.`t_test`(`id`, `time`, `num`) VALUES (4, '2020-06-04 10:35:26', NULL);


-- 如果存在名为p_while的存储过程,则删除
drop procedure if exists p_while;
delimiter;
-- 创建存储过程
CREATE PROCEDURE p_while() 
BEGIN 
    DECLARE max_id INT; 
    DECLARE v INT;
    declare _num int;
    declare _time int;
    select MAX(id) into max_id from t_test;
    set v = 1;
    -- 循环所有id,更新num字段
    -- 这里如果id不连续,则需要判断,或者采用其他循环条件,只要遍历到所有记录即可
    WHILE v <= max_id DO 
        select UNIX_TIMESTAMP(time) into _time from t_test where id = v;
        select count(*) into _num from t_test where UNIX_TIMESTAMP(time) < _time;
        update t_test set num = _num where id = v;
        set v = v + 1;
    END WHILE; 
end;
-- 调用存储过程
call p_while();
-- 查询数据
SELECT * from t_test;

最后查询结果:
image.png

综上,存储过程可以完美解决题主的问题,记得采纳哦。

花间憩 2022-09-19 03:16:32

请注意一个细节,前面还有多少位,在有特定排序的情况下和查询结果的 行号 有关

所以逻辑上这样写是可以的

set @idx = 0;

select 
t.*,
@idx as `此记录前有多少位`,
@idx := @idx+1
from (/* 你的 sql */) as t
作死小能手 2022-09-19 03:16:32
select *,(SELECT count(*) from QMqueuing where timenode< 此司机入队列的timenode) as '此记录前面还有几位' from QMqueuing

* * *



首先计算数据量的时候推荐你使用count(*)因为count(*)是 SQL92 定义的 标准统计行数的语法,其二,一般来说不推荐你使用sql实时计算,你可以在插入数据时,将该字段算出结果后再插入,这样就不需要查询一遍,就计算一遍
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文