java - SQLite 分组并按工作类次排序

标签 java sql sqlite date datetime

我有一个查询需要执行基于运行总和的查询 关于日期/时间和类次。

轮类时间为上午 6:00 至下午 4:30 下午 6:00 至凌晨 4:30。

我使用的查询引擎是SQLite。

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

有没有人以前遇到过这个问题并且可以 插入我朝正确的方向前进。我愿意接受建议 即使我必须在没有查询的情况下对数据进行排序,最好使用 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');

最佳答案

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

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,请使用 View 而不是 CTE。

关于java - SQLite 分组并按工作类次排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24026747/

相关文章:

java - 面向多个消费者 - 一个或多个队列?

java - Spring Boot @RequestBody 没有完全复制参数

c# - 正则表达式在 C# 中匹配,但在 java 中不匹配

javascript - 如何对 Hive 生成​​的平面文件运行即席 SQL 查询?

sql - 删除字段值中的空格

Sqlite 查询优化(select * from where in AND not in order by limit offset)

python - 使 SQLalchemy 将字符串存储为小写的正确方法是什么?

Java RMI - 从接口(interface)/$Proxy 转换为原始类?

php - MySQL 查询以最大 event_count 分组?

java - Android sqlite 获取计数返回 1