MySQL查询以获取日期范围内的端点?

Posted

技术标签:

【中文标题】MySQL查询以获取日期范围内的端点?【英文标题】:MySQL Query to get endpoints within a date range? 【发布时间】:2014-02-06 18:08:23 【问题描述】:

我有一个包含客户投资交易的数据库。每个季度(四个月)有一个期初余额,一个期末余额,中间有 N 笔交易。

表格结构如下:

transaction_id (primary key)
investment_id (index, foreign key)
amount (decimal(11,2))
type (ENUM:'Opening','Closing','Transfer')
transaction_date (DATE)

我需要创建一个视图,该视图将为每个investment_id 检索“Opening”类型的第一笔交易、“Closing”类型的最后一笔交易以及特定日期之间的所有“Transfer”类型的交易范围。但是,除该范围内的端点外,不应包含“打开”或“关闭”类型的事务。例如:

SELECT * FROM view_transactions
WHERE transaction_date > '2000-01-01' AND transaction_date < '2006-06-01'
AND investment_id = 6578734

谢谢!

【问题讨论】:

好的,有什么问题? Retrieving the last record in each group 的可能重复项 使用该答案中的技术来获取每个组中的打开和关闭交易,并将它们与UNION结合起来。 我可以在一个查询中完成这一切,但问题是我想将大部分查询存储在一个视图中,以便在应用程序查询中,所有必须指定的是投资 ID 和日期范围.我不确定这是否可行,因为视图内的查询将在外部查询的 WHERE 子句之前执行。 【参考方案1】:
CREATE FUNCTION pFunc1() returns DATE DETERMINISTIC NO SQL return @param;
CREATE FUNCTION pFunc2() returns DATE DETERMINISTIC NO SQL return @param;

CREATE VIEW view_transactions AS
   SELECT * 
   FROM transactions
   WHERE
        type = 'Opening' AND
        transaction_date > pFunc1() AND
        transaction_date < pFunc2()
   ORDER BY transaction_date
   LIMIT 1
   UNION
   SELECT *
   FROM transactions
   WHERE
        type = 'Transfer' AND
        transaction_date > pFunc1() AND
        transaction_date < pFunc2() AND
   UNION
   SELECT *
   FROM transactions
   WHERE
        type = 'Closing' AND
        transaction_date > pFunc1() AND
        transaction_date < pFunc2()
   ORDER BY transaction_date DESC
   LIMIT 1;

然后:

  SELECT v.*
  FROM (select @param:='2000-01-01' pFunc1) param1, (select @param:='2000-06-01' pFunc2) param2 view_transactions v;

【讨论】:

是的,这是我试图解决的主要问题。我不确定是否有某种方式可以做到这一点,这样就不会包括额外的打开和关闭交易 是否有任何方法可以将 transaction_date 上的 WHERE 子句传递给子查询? 我对此表示怀疑。在这种情况下,您可以创建一个过程。 另外,该查询只会选择所有交易中最早的开仓交易和最后平仓的交易,因此不会包含每组investment_id 视图中的查询当然是通用的。查询视图时必须对其进行过滤。

以上是关于MySQL查询以获取日期范围内的端点?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法获取某个日期范围内的记录?

如何使用活动记录查询sql以获取指定时间之间的日期

用于获取多个日期范围的 mysql 查询

Mysql 将给定日期范围内的每日总计转化为每周总计

在 Power Query 中获取多个日期范围(和 if 语句)内的输出

MySQL:选择两个日期范围内的所有数据