mysql - SQL 子查询/子选择从下一行获取值而没有自动递增 id 或任何不同的字段加入

标签 mysql sql subquery

好的,所以我花了很多时间研究并试图解决这个问题。我可能已经阅读了 SO 关于这个主题的所有内容,但没有任何内容适合我正在尝试做的事情。我不确定我正在尝试的事情是否可以按照我尝试的方式完成,但似乎应该如此。

使这变得困难的主要事情是没有唯一的字段或 id 可供引用,所以我必须为行创建自己的编号。

我已经尝试了很多不同的东西,我不能把它们全部贴在这里,但是任何答案都将不胜感激。

给定这张表。

create table `working_time_table` (

  `id` INT(255),
  `eff_date` VARCHAR(255),
  `percentage` INT(255)

  );

insert into `working_time_table` (`id`, `eff_date`, `percentage`) values (12,'01-JUN-2012',70);
insert into `working_time_table` (`id`, `eff_date`, `percentage`) values (12,'03-MAR-2013',100);
insert into `working_time_table` (`id`, `eff_date`, `percentage`) values (12,'13-DEC-2014',85);

我正在尝试为每一行获取一个结果,该结果在下一行中查找日期,然后从日期中减去一个。到目前为止,除了如何从下一行获取日期值外,我已经弄清楚了一切。

我在结果中添加了“currentrow”和“nextrow”列。所以我使用变量对列进行编号,我只是不知道如何告诉数据库我想要获取下一列的日期并将其作为结果显示在当前列中。

这是我的查询...如您所见,我正在为当前行和下一行获取正确的值,我只需要从下一行获取日期并将其显示在当前行上。

您可以忽略“nd”的内容,因为它只是将日期解析为我可以在其上使用 DATE_SUB 的格式。

SQLFIDDLE

SELECT 
    wtt.*
FROM (SELECT 
            DATE_FORMAT ( STR_TO_DATE ( CONCAT(
                LOWER(SUBSTRING(`eff_date`,1,3)),
                UPPER(SUBSTRING(`eff_date`,4,1)),
                LOWER(SUBSTRING(`eff_date`,5,7)
            )), '%d-%b-%Y %T'), '%Y-%m-%d %T') 
        AS nd,
       `id`,
        `percentage`,
        `eff_date`,
         t.currentrow,
         t.nextrow

       FROM (SELECT 
                 eff_date, 
                 id, 
                 percentage, 
          (@cnt :=@row_number) currentrow,
                @row_number:=@row_number+1
             AS nextrow
             FROM 
             (SELECT @row_number:=0) as x,
                 working_time_table AS y  
       ) AS t
) AS wtt

这给了我以下结果......

enter image description here

现在我只需要弄清楚如何告诉它我想要下一行的日期。因此,应该有一列(如果需要,可以使用第一列“nd”),其中包含下一行的日期减去一天。像这样...

enter image description here

我可以使用 DATE_SUB 来减去日期,我只需要以某种方式将该行中的日期获取到当前行中,我就可以开始了。

我已经尝试了一百万种方法,但没有一种起作用。非常感谢任何帮助。

最佳答案

试试这个查询

SELECT id, firstTbl.eff_Date, 
UPPER(DATE_FORMAT(DATE_ADD(STR_TO_DATE(secondTbl.eff_Date, '%d-%M-%Y'), INTERVAL -1 DAY), '%d-%b-%Y')) todate, 
percentage FROM 
(SELECT (@cnt := @cnt + 1) rownum, id, eff_date, percentage 
   FROM working_time_table , (SELECT @cnt := 0) s) firstTbl
LEFT JOIN 
(SELECT (@cnt1 := @cnt1 + 1) rownum, eff_date 
   FROM working_time_table , (SELECT @cnt1 := 0) s) secondTbl
ON (firstTbl.rownum + 1) = secondTbl.rownum

SQL Fiddle Link

关于mysql - SQL 子查询/子选择从下一行获取值而没有自动递增 id 或任何不同的字段加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30909010/

相关文章:

mysql - 每组最新 5 条,带全文搜索

mysql 更新子查询 2 级深度

php - Laravel 开发 : Implication when creating MySQL database manually

php - 无法从 WAMP 登录 MySQL,但可以登录 MariaDB

mysql - 为什么向我的查询添加 WHERE 语句(在具有索引的列上)会使我的运行时间从几秒增加到几分钟?

SQL 格式化标准

mysql - 如何获取mysql中两个表中列之间的匹配计数

java - 这里需要关闭数据库连接吗?

sql - 在 Postgres 触发器过程中执行的查询是否在同一事务中运行?

php - 从内部连接表中获取计数