在SQL

时间:2015-09-29 15:44:42

标签: mysql sql sql-server function

我尝试使用where子句中的函数来获取上一个营业日期,以便计算表格中列的增量

我使用了以下查询:

select db1.x, db2.date, db1.date, db1.y as ValNow, db2.y as ValPrevious 
from db db1, db db2 
where db1.x = 275305 
  and db1.x = db2.x 
  and (dbo.getLastBusinessDate(db1.date) = db2.date) 
order by db1.date

我需要使用该功能,因为它将包含没有值的特殊日期

编辑:

很抱歉,我收到的错误是

Msg 557,Level 16,State 2,Line 1 只能在函数内执行函数和一些扩展存储过程。

我只想现在并排显示值以确认sql语句是否正常工作,我打算使用以下语句来计算delta

select db1.date, db1.x, (db1.y - db2.y)  as delta , DAY(db1.date), DAY(db2.date)
from 
    db db1
    inner JOIN db db2 on db1.x = db2.x and dbo.getLastBusinessDate(db1.date) = db2.date
order by date desc

1 个答案:

答案 0 :(得分:0)

首先使用LEFT JOIN,因为第一个日期没有“上一个日期”。您可能希望处理null。

然后在联接中使用doble条件,首先是db1.x = db2.xdb1.date > db2.date,以确保您匹配早期日期。

where中,您必须确保选择确切的上一个日期。

这应该在MySql或SqlServer中都有效,但是在sql server中你可以使用window函数来获得更好的结果。

SELECT 
   db1.x, 
   db2.date, 
   db1.date, 
   db1.y as ValNow, 
   db2.y as ValPrevious 
FROM  
     db db1 
LEFT JOIN db db2 
   ON  db1.x = db2.x
  AND  db1.date > db2.date
WHERE db1.x = 275305 
 AND not exist (SELECT db3.date
                FROM db db3
                WHERE db3.date > db2.date 
                 AND  db3.date < db1.date)                 
ORDER BY db1.date