根据条件计算两行之间的天数

时间:2016-06-27 11:41:18

标签: sql hsqldb

我正在编写必须选择少量信息的查询。下表:

ID  ID-Toner    Quantity    Location    Order_date  Send_date
1     2            1           55       20.01.2015  26.01.2015
2     2            1           41       22.02.2015  26.02.2015
3     2            1           35       23.02.2015  26.02.2015
4     5            1           77       25.02.2015  25.02.2015
5     2            1           55       25.02.2015  26.02.2015

我需要选择所有列和其他列,其中包含两个日期之间的天数:Order_date和之前的Order_date for location = ie。:55。 示例结果应如下所示:

ID  ID-Toner Quantity Location  Order_date  Send_date  Number_of_days
 1     2         1       55     20.01.2015  26.01.2015       0
 5     2         1       55     25.02.2015  26.02.2015       36

如何选择这样的查询?

1 个答案:

答案 0 :(得分:0)

在PO

中进行说明后,

已更新

让我们说它需要对称为排名的数据进行一种聚合,这是一种基于连续顺序tbale行的编号的分类。

在我们的案例中,订单由订单日期给出。

这是一个非常交叉的dbms解决方案(日期字段被认为是Datetime类型,DATEDIFF是MySql的一个函数)所以我认为你可以很容易地适应你的dbms。

您可以在http://sqlfiddle.com/#!9/290e9

上尝试使用Sql Fiddle上的sql
  

表格

CREATE TABLE Orders
    (`ID` int, `IDToner` int, `Quantity` int, `Location` int, `Order_date` Date, `Send_date` Date)
;

INSERT INTO Orders
    (`ID`, `IDToner`, `Quantity`, `Location`, `Order_date`, `Send_date`)
VALUES
    (1, 2, 1, 55, STR_TO_DATE('20.01.2015','%d.%m.%Y'), STR_TO_DATE('26.01.2015','%d.%m.%Y')),
    (2, 2, 1, 41, STR_TO_DATE('22.02.2015','%d.%m.%Y'), STR_TO_DATE('26.02.2015','%d.%m.%Y')),
    (3, 2, 1, 35, STR_TO_DATE('23.02.2015','%d.%m.%Y'), STR_TO_DATE('26.02.2015','%d.%m.%Y')),
    (4, 5, 1, 77, STR_TO_DATE('25.02.2015','%d.%m.%Y'), STR_TO_DATE('25.02.2015','%d.%m.%Y')),
    (5, 5, 1, 77, STR_TO_DATE('25.04.2015','%d.%m.%Y'), STR_TO_DATE('25.04.2015','%d.%m.%Y')),
    (6, 5, 1, 77, STR_TO_DATE('25.06.2015','%d.%m.%Y'), STR_TO_DATE('25.06.2015','%d.%m.%Y')),
    (7, 5, 1, 77, STR_TO_DATE('25.08.2015','%d.%m.%Y'), STR_TO_DATE('25.08.2015','%d.%m.%Y')),
    (8, 2, 1, 55, STR_TO_DATE('25.02.2015','%d.%m.%Y'), STR_TO_DATE('26.02.2015','%d.%m.%Y'))
;


  

<强>查询

SELECT 
        ID,
        ID_Toner,
        Quantity,
        Location, 
        Order_date, 
        Send_date,        
        days_from_previous_order
FROM(
  SELECT 
        current_ID AS ID,
        current_IDToner AS ID_Toner,
        current_Quantity AS Quantity,
        current_Location AS Location, 
        current_Send_Date AS Send_date,        
        current_Order_Date AS Order_date, 
        previous_Order_Date,
        COALESCE(DATEDIFF(current_Order_Date, previous_Order_Date),0) AS days_from_previous_order
  FROM(
        SELECT 
              TabOrdersRanking_currents.ID AS current_ID,
              TabOrdersRanking_currents.IDToner AS current_IDToner,
              TabOrdersRanking_currents.Quantity AS current_Quantity,
              TabOrdersRanking_currents.Location AS current_Location, 
              TabOrdersRanking_currents.Send_Date AS current_Send_Date,        
              TabOrdersRanking_currents.Order_Date AS current_Order_Date, 
              TabOrdersRanking_previous.Order_Date AS previous_Order_Date 
        FROM(
          SELECT Orders.*, @rank1 := @rank1 + 1 rank
          FROM Orders 
          ,(Select @rank1 := 0) r1   
          order by location, order_date
        ) TabOrdersRanking_currents
        LEFT JOIN( 
          SELECT Orders.*, @rank2 := @rank2 + 1 rank
          FROM Orders 
          ,(Select @rank2 := 0) r2   
          order by location, order_date
        ) TabOrdersRanking_previous
        on TabOrdersRanking_currents.Location = TabOrdersRanking_previous.Location 
        and TabOrdersRanking_currents.rank - TabOrdersRanking_previous.rank = 1      
  ) TabOrdersSuccessionRanking
) TabWithDaysFromPrevious;