【问题标题】:SQLite Group and Sort By Work ShiftSQLite 分组和按班次排序
【发布时间】:2014-06-03 23:40:13
【问题描述】:

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

轮班时间为上午 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');

【问题讨论】:

    标签: java sql sqlite date datetime


    【解决方案1】:

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

    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。

    【讨论】:

    • 这有效,甚至正确地分组了一个错误的日期,我注意到我插入并归类为第二班。但是我现在需要将我的 JDBC SQLite 驱动程序升级到 3.8.3。我使用的是 3.7,查询在 WITH 附近出现错误。有没有办法在不使用 WITH 语句的情况下做到这一点?我试图创建一个没有 WITH CTE 语句的视图,结果出现了更多的语法错误。
    • CREATE VIEW a AS SELECT ID ...;
    • 谢谢。我只需要稍作修改并在底部创建第二个视图,然后我所要做的就是 select * from c
    【解决方案2】:

    我认为您可以通过从时间中减去 5 小时并将其用作比较日期来做您想做的事情。这样,凌晨 4:00 将与晚上 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;
    

    【讨论】:

    • 更接近,但结果仍然关闭。我很快就会发布这个修改后的查询的结果。
    • 没有没有工作谢谢你的帮助。如果有什么我可以做的,比如提供更多示例数据,我可以提供。
    • @user3701137 。 . .你可以在 SQL Fiddle 上放一个例子。
    • 不知道如何分享小提琴,但我编辑了帖子以公开示例方案
    猜你喜欢
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多