我在下面需要一些帮助
我有表格“数据”将数据存储在其中,如下所示
+------------+----------+-----------
| regdate | regtime | items
+------------+----------+-----------
| 2013-03-02 | 09:12:03 | item1
| 2013-03-02 | 10:12:05 | item1
| 2013-03-02 | 15:12:07 | item2
| 2013-03-02 | 20:12:09 | item3
| 2013-03-02 | 21:12:11 | item4
| 2013-03-02 | 22:12:14 | item3
10件的等可以在白天的不同时间从 09:00到23:00
进入桌面我还有另一张表“ItemsPerInterval”,如下所示
+------------+-------------+-------------+-------------+-------------+
| regdate | reginterval | item1 | item2 | item3 |
+------------+-------------+-------------+-------------+-------------+
| 2013-03-01 | 09:00:00 | 0 | 0 | 0 |
+------------+-------------+-------------+-------------+-------------+
等等,间隔在 30分钟基础上增加,如09:00,09:30,10:00,10:30 ......至23:00
我想要做的是在表 ItemsPerInterval 上插入数据 包括表格中项目的重复计数“数据”( item1,item2,item3,.... item10 ) 并按间隔( 09:00:00,09:30:00,10:00:00,10:30:00,...... 23:00:00 )存储它们,以便每个时间间隔 - 例如 - 09:00:00 将包含 09:00:00 数据表中已注册的所有商品的重复计数直到09:29:59 所以其余的间隔一直到23:00:00
编辑** 1
因此,最终所有以下间隔必须在ItemsPerInterval表中注册,并保留在间隔时间窗口中报告的10个项目中每个项目的计数
09:00:00
09:30:00
10:00:00
10:30:00
11:00:00
11:30:00
12:00:00
12:30:00
13:00:00
13:30:00
and so on .....
.
.
.
22:00:00
22:30:00
23:00:00
/编辑** 1
我做了一些关于例程/程序的读物,但我不知道其中的区别,也不知道如何使用它来实现上述。
我正在使用 软件:MySQL 软件版本:5.5.24 用PHP。感谢您的支持
谢谢
答案 0 :(得分:5)
您可以使用此查询:
SELECT
regdate,
SEC_TO_TIME(TRUNCATE(TIME_TO_SEC(regtime)/(60*30),0)*(60*30)) reginterval,
COUNT(CASE WHEN items='item1' THEN 1 END) item1,
COUNT(CASE WHEN items='item2' THEN 1 END) item2,
COUNT(CASE WHEN items='item3' THEN 1 END) item3,
COUNT(CASE WHEN items='item4' THEN 1 END) item4
FROM Data
GROUP BY
regdate,
reginterval
如果您需要将结果行插入新表中,只需在开头添加以下行:
INSERT INTO ItemsPerInterval (regdate, reginterval, item1, item2, item3, item4)
SELECT ...
修改强>
如果您还想显示所有间隔,即使它们没有值,我认为您可以做的最好的事情是让表Intervals
包含您需要的所有间隔:
CREATE TABLE Intervals (
reginterval time
);
INSERT INTO Intervals VALUES
('09:00:00'),
('09:30:00'),
('10:00:00'),
...
此查询返回所有间隔,并结合表格中的所有日期:
SELECT Dates.regdate, Intervals.reginterval
FROM
(SELECT DISTINCT regdate FROM Data) Dates,
Intervals
此查询返回您需要的行:
SELECT
di.regdate,
di.reginterval,
COUNT(CASE WHEN Data.items='item1' THEN 1 END) item1,
COUNT(CASE WHEN Data.items='item2' THEN 1 END) item2,
COUNT(CASE WHEN Data.items='item3' THEN 1 END) item3,
COUNT(CASE WHEN Data.items='item4' THEN 1 END) item4
FROM (
SELECT Dates.regdate, Intervals.reginterval
FROM (SELECT DISTINCT regdate FROM Data) Dates,
Intervals
) di
LEFT JOIN Data
ON di.regdate=Data.regdate
AND di.reginterval=SEC_TO_TIME(TRUNCATE(TIME_TO_SEC(Data.regtime)/(60*30),0)*(60*30))
GROUP BY
regdate,
reginterval;
请参阅小提琴here。
这是如何运作的
这里的想法是使用TIME_TO_SEC函数将regtime
(包含时间的字段)转换为自当天开始以来的秒数:
TIME_TO_SEC(regtime)
然后我们将这个数字除以60 * 30,即30分钟内的秒数,只保留整数部分:
TRUNCATE(number_of_seconds/(60*30), 0)
然后我们将整数部分乘以60 * 30以获得秒数,舍入60 * 30秒(30分钟)。
SEC_TO_TIME我们将秒数转换回时间字段。