好的,所以我花了很多时间研究并试图解决这个问题。我可能已经阅读了 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 的格式。
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
这给了我以下结果......
现在我只需要弄清楚如何告诉它我想要下一行的日期。因此,应该有一列(如果需要,可以使用第一列“nd”),其中包含下一行的日期减去一天。像这样...
我可以使用 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
关于mysql - SQL 子查询/子选择从下一行获取值而没有自动递增 id 或任何不同的字段加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30909010/