SQLite Group和按工作班次排序

时间:2014-06-03 23:40:13

标签: java sql sqlite date datetime

我有一个需要执行运行总和的查询 在日期/时间和班次。

班次是上午6:00到下午4:30 和下午6:00到4:30。

我正在使用的查询引擎是SQLite。

我遇到以下SQL查询的问题。您将在下面看到该查询 和当前的结果,然后是期望的结果。 按日期/时间/班次顺序排列当前结果 导致总QTY列也显示不正确的数据。

是否有人在此之前遇到过这个问题,并且可能 把我推向正确的方向。我愿意接受建议 即使我必须在没有查询的情况下对数据进行排序,最好使用 的java。

SELECT tdate, qty, shift,
       ( 
           SELECT sum( b.qty )
           FROM table1 AS b
           WHERE (   
                     ( 
                        ( b.id <= a.id AND b.shift = a.shift)
                     )  
                 ) 
            GROUP BY date(b.tdate)
       ) 
       AS bo_total
FROM table1 AS a
ORDER BY date( a.tdate ) ASC, a.shift ASC

当前结果

DATE/TIME             QTY          SHIFT   TOTAL QTY
2014-04-21 07:19:00        60           first        60
2014-04-21 08:45:00        60           first        120
2014-04-21 09:52:00        60           first        180
2014-04-21 13:26:00        60           first        240
2014-04-21 18:51:00        60           second       60
2014-04-21 20:56:00        60           second       120
2014-04-22 06:52:00        60           first        60
2014-04-22 11:56:00        60           first        120
2014-04-22 19:12:00        60           second       60
2014-04-22 20:30:00        60           second       120
2014-04-22 00:50:00        60           second       120
2014-04-23 06:23:00        60           first        60
2014-04-23 09:19:00        60           first        120
2014-04-23 22:11:00        60           second       60
2014-04-23 19:39:00        60           second       120
2014-04-23 00:55:00        60           second       120
2014-04-24 06:59:00        60           first        60
2014-04-24 07:40:00        60           first        120
2014-04-24 16:03:00        60           first        240
2014-04-24 00:42:00        60           second       60
2014-04-24 20:25:00        60           second       120
2014-04-24 00:39:00        60           second       60
2014-04-24 02:32:00        60           second       60

期望的结果

DATE/TIME              QTY            SHIFT   TOTAL QTY
2014-04-21 07:19:00        60           first        60
2014-04-21 08:45:00        60           first        120
2014-04-21 09:52:00        60           first        180
2014-04-21 13:26:00        60           first        240
2014-04-21 18:51:00        60           second       60
2014-04-21 20:56:00        60           second       120
2014-04-22 00:50:00        60           second       180
2014-04-22 06:52:00        60           first        60
2014-04-22 11:56:00        60           first        120
2014-04-22 19:12:00        60           second       60
2014-04-22 20:30:00        60           second       120
2014-04-23 00:55:00        60           second       180
2014-04-23 06:23:00        60           first        60
2014-04-23 09:19:00        60           first        120
2014-04-23 19:39:00        60           second       60
2014-04-23 22:11:00        60           second       120
2014-04-24 00:39:00        60           second       180
2014-04-24 00:42:00        60           second       240
2014-04-24 02:32:00        60           second       300
2014-04-24 06:59:00        60           first        60
2014-04-24 07:40:00        60           first        120
2014-04-24 16:03:00        60           first        180
2014-04-24 20:25:00        60           second       60

示例方案

CREATE TABLE Table1 ( 
    ID         INTEGER PRIMARY KEY AUTOINCREMENT,
    qty        STRING,
    tdate      STRING,
    shift      STRING 
);

INSERT Into Table1 values(NULL,'60','2014-05-16 08:38:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-16 00:15:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-16 15:48:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-16 19:46:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-16 21:44:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-17 00:25:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-17 03:45:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-15 06:02:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-15 08:40:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-15 11:05:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-15 13:48:00','first');
INSERT Into Table1 values(NULL,'6','2014-05-15 16:08:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-15 19:08:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-15 21:26:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-16 01:16:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-16 04:09:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-14 05:49:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-14 09:58:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-14 13:33:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-14 18:53:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-15 00:09:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-15 02:50:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-13 06:32:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-13 09:19:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-13 00:13:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-13 13:15:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-13 18:28:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-13 21:04:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-13 22:26:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-14 00:44:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-14 02:35:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-12 06:20:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-12 07:12:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-12 09:25:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-12 00:01:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-12 14:51:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-12 19:11:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-12 21:19:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-13 00:07:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-13 02:17:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-10 08:15:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-10 09:36:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-10 09:37:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-10 11:59:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-10 14:44:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-10 19:17:00','second');
INSERT Into Table1 values(NULL,'13','2014-05-10 21:43:00','second');
INSERT Into Table1 values(NULL,'58','2014-05-10 21:43:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-11 00:30:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-11 02:41:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-09 06:12:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-09 09:07:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-09 11:57:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-09 14:20:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-09 18:41:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-09 21:03:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-09 23:56:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-10 01:43:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-10 03:28:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-10 04:19:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-08 06:04:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-08 09:17:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-08 11:12:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-08 20:16:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-08 21:24:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-09 00:03:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-09 01:53:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-07 06:13:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-07 07:34:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-07 09:25:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-07 00:45:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-07 20:19:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-07 21:50:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-08 00:11:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-08 02:33:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-06 06:09:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-06 07:42:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-06 09:12:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-06 00:43:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-06 18:47:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-06 21:09:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-06 23:14:00','second');
INSERT Into Table1 values(NULL,'50','2014-05-06 23:16:00','second');
INSERT Into Table1 values(NULL,'61','2014-05-06 23:16:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-07 00:20:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-07 02:09:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-05 06:45:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-05 08:12:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-05 10:27:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-05 14:32:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-05 19:46:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-05 22:18:00','second');

2 个答案:

答案 0 :(得分:0)

我认为你可以通过减去5个小时并将其作为比较日期来做你想做的事。这样,凌晨4点将与下午11点在同一“日”。之前的日期。我认为以下是在SQLite中做到的:

SELECT tdate, qty, shift,
       (SELECT sum( b.qty )
        FROM table1 AS b
        WHERE b.id <= a.id AND b.shift = a.shift and
              date(b.tdate, '-5 Hours') = date(a.tdate, '-5 Hours')
       ) 
       AS bo_total
FROM table1 AS a
ORDER BY date(a.tdate ) ASC, a.shift ASC;

答案 1 :(得分:0)

此查询首先计算班次开始的日期,这使得班次比较更容易:

WITH a AS
(SELECT ID,
        qty,
        tdate,
        shift,
        CASE
          WHEN time(tdate) BETWEEN '05:30' AND '17:00'
                                       THEN date(tdate)           || ' first'
          WHEN time(tdate) >= '17:30'  THEN date(tdate)           || ' second'
          WHEN time(tdate) <= '05:00'  THEN date(tdate, '-1 day') || ' second'
        END AS ShiftID
 FROM Table1)
SELECT tdate,
       qty,
       shift,
       (SELECT sum(qty)
        FROM a AS b
        WHERE b.ShiftID = a.ShiftID
          AND b.tdate  <= a.tdate
       ) AS bo_total
FROM a
ORDER BY tdate

如果您的SQLite驱动程序早于3.8.3,请使用视图而不是CTE。