mysql - 按滚动日期序列对 MySQL View 进行分组

标签 mysql sql-view

我有两张 table :

Table Transmission
------------------------------
Id  GroupID Amount Timestamp
1   1       5      2015-05-20 00:00:00
2   1       4      2015-05-19 00:00:00
3   1       10      2015-04-20 00:00:00
4   1       7      2015-04-19 00:00:00
5   1       9      2015-03-20 00:00:00
6   1       2      2015-03-18 00:00:00


Table Group
---------
Id DateCreated BillStart  BillStop
1  2015-03-15  2015-05-15 2015-06-14

BillStart 和 BillStop 都有一个每天运行的触发器,如果​​当前日期大于 BillStop,BillStart/BillStop 都会增加一个月(因此这些实际上是我们正在查看的当前范围)。

我已经有一个 SQL View ,可以汇总时间戳介于 BillStart 和 BillStop 之间的一系列传输条目,我想要做的是有另一个 View ,可以有效地保存过去几个月的传输总和。即,如果 BillStart/BillStop 从 2015-05-15 到 2015-06-14,则 View 将知道对 2015-4-15 到 20-15-14、2015-3-15 范围内的过去传输进行分组到 2015 年 4 月 14 日,依此类推,直到包含组创建日期的最后一个范围。

理想情况下, View 看起来像这样

-------------------------------------
GroupId   Sum   BillStart   BillStop
1         9     2015-05-15  2015-06-14
1         17     2015-04-15  2015-05-14
1         11     2015-03-15  2015-04-14

有更好的方法吗?

我正在考虑的另一个选择是 GroupBillRanges 表格,它需要:

GroupBillRange
--------------
Id GroupId BillStart   BillStop
1  1       2015-03-15  2015-04-14
2  1       2015-04-15  2015-05-14
3  1       2015-05-15  2015-06-14

当每个帐单范围按月更新时,将会添加此内容。有了这个,我就可以将所有 Transmission.GroupIdGroupDateRange.GroupId

相匹配

最佳答案

是的,您需要创建“GroupBillRange”表。否则,您将丢失旧组中账单开始/停止日期的任何记录。 (当然,您可以假设它们总是从 15 号到 14 号。但是一旦它们不是,您就会遇到问题。)一旦您这样做,如下所示的查询应该会为您提供您正在查找的内容因为,我相信。 (哦,这个问题被标记为 SQL Server 和 MySQL。所以我在 SQL Server 2008 r2 上创建了这个脚本。)

SET NOCOUNT ON;

DECLARE @Transmission TABLE (
  ID int,
  GroupID int,
  Amount int,
  TransmissionDate SmallDateTime );

INSERT @Transmission VALUES (1, 1, 5,'2015/05/20');
INSERT @Transmission VALUES (2, 1, 4,'2015/05/19');
INSERT @Transmission VALUES (3, 1,10,'2015/04/20');
INSERT @Transmission VALUES (4, 1, 7,'2015/04/19');
INSERT @Transmission VALUES (5, 1, 9,'2015/03/20');
INSERT @Transmission VALUES (6, 1, 2,'2015/03/18');

DECLARE @TableGroupRange TABLE (
  ID int,
  GroupID int,
  BillStart SmallDateTime,
  BillStop SmallDateTime );

INSERT @TableGroupRange VALUES (1, 1, '2015/03/15', '2015/04/14' )
INSERT @TableGroupRange VALUES (2, 1, '2015/04/15', '2015/05/14' )
INSERT @TableGroupRange VALUES (3, 1, '2015/05/15', '2015/06/14' )

SET NOCOUNT OFF;

SELECT      TG.GroupID, SUM(T.Amount) as SumAmount, TG.BillStart, TG.BillStop
FROM        @TableGroupRange TG
LEFT JOIN   @Transmission T ON T.GroupID = TG.GroupID AND T.TransmissionDate BETWEEN TG.BillStart AND TG.BillStop
GROUP BY    TG.GroupID, TG.BillStart, TG.BillStop
ORDER BY    TG.GroupID, TG.BillStart, TG.BillStop

关于mysql - 按滚动日期序列对 MySQL View 进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30223577/

相关文章:

导入 WordPress sql 文件时 MySQL 服务器消失了

javascript - 扰乱单选按钮数据

php - 从 mysqli_multi_query 检索数组。数组为空?

sql - 如何使 View 列不为空

sql - MariaDB 创建 View 将 SELECT 更改为不同的(不正确的)查询

mysql - 删除顺序数据中的 NULL - MYSQL

INSERT INTO...ON DUPLICATE UPDATE 的 MySQL 索引

mysql 选择动态行作为列名

sql - 在 View 中使用带有 SQL 函数的联接

sql - 当多个 UNION 都进行相同的连接时,有没有办法使它们更有效?