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查询以获取日期范围内的端点?的主要内容,如果未能解决你的问题,请参考以下文章