mysql-如何在数据库的整个历史记录中使用特定的最小时间间隔来查找日期

0wi1tuuw  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(301)

我有一个数据库,跟踪上市公司高管出售的股票。我正在尝试创建一个查询,在这里我可以识别出10年或更长时间内首次出售股票的任何高管(并识别他们出售股票的日期)。这个数据库可以追溯到20多年前。
名为“fact\u insider\u sales”的表有几列数据。以下是相关列的部分列表:
身份证件
股票代码
股票id(股票名称)
申报人id(主管姓名)
关系id(主管职务)
交易日期(出售日期)
股份(当日卖出多少股)
有时候,一个主管经常销售,有时候他们很少销售。该表仅在高管出售任何数量的股票时捕获数据,并捕获他/她出售股票的日期。我试图使用的相关列进行此查询是“transaction\u date”,而“transaction\u date”数据的格式是“yyyy-mm-dd”
本质上,我是在试图识别数据库整个历史中的任何一个交易日期,该高管在10年或更长时间内第一次出售了该数据库。
我曾考虑过使用max()和min()函数以及datesub(),但我似乎无法找到正确的逻辑,以便在更广泛的数据库中找到数据在何处满足这个离散时间间隔。我的所有其他查询都集中在近期的最新销售活动上,使用像下面这样的编码语言跟踪最近30天的销售(这不适用于此目的):

a.transaction_date >= date_sub(curdate(), INTERVAL 30 Day)

以下是迄今为止我无法完成的查询:

SELECT 
e.stock_name,     
e.stock_id,
f.ticker_id,
f.ticker_name,
a.transaction_date,
d.filer_name,
b.relationship_name,
b.relationship_id
FROM fact_insider_sales as a 
join dim_relationship as b ON (a.relationship_id = b.relationship_id)
join dim_filer as d on (a.filer_id = d.filer_id)
join dim_stock as e on (a.stock_id = e.stock_id)
join dim_ticker as f ON (a.ticker_id = f.ticker_id)
WHERE a.transaction_date ??????????????????????????????? 
and b.relationship_name IN ('CEO', 'CB')

任何人都能提供他们的专业知识来创建正确的逻辑并使这个事务日期时间段正确吗?提前谢谢!

sgtfey8w

sgtfey8w1#

如果要查询从当前日期起10年后的数据,可以使用:

WHERE a.transaction_date <= date_sub(curdate(), interval 10 year)

这将给你所有的交易10年前,但仍然没有显示你的第一次。为此,您将需要一个子查询来按executive查找特定的数据。

SELECT filer_id,min(transaction_date) AS first_time
FROM fact_insider_sales
WHERE transaction_date <= date_sub(curdate(), interval 10 year)
GROUP BY filer_id

现在将此查询作为表包含在原始查询中:

SELECT 
e.stock_name,     
e.stock_id,
f.ticker_id,
f.ticker_name,
a.transaction_date,
d.filer_name,
b.relationship_name,
b.relationship_id
FROM fact_insider_sales as a
JOIN (SELECT filer_id,min(transaction_date) AS first_time
    FROM fact_insider_sales
    WHERE transaction_date <= date_sub(curdate(), interval 10 year)
    GROUP BY filer_id) AS p
  ON a.filer_id=p.filer_id
JOIN dim_relationship as b ON (a.relationship_id = b.relationship_id)
JOIN dim_filer as d on (a.filer_id = d.filer_id)
JOIN dim_stock as e on (a.stock_id = e.stock_id)
JOIN dim_ticker as f ON (a.ticker_id = f.ticker_id)
WHERE a.transaction_date = p.first_time
AND b.relationship_name IN ('CEO', 'CB')
bihw5rsg

bihw5rsg2#

使用此查询,您可以像我的示例中那样从中创建一个视图,也可以简单地将查询加入到 FROM 条款:
单击此处查看dbfiddle示例
创建列出每个 filer_id 出售,以及与下一个最老的 transaction_date 为了这个 filer_id :

CREATE VIEW sales_date_diff AS
SELECT  f1.id, 
        f1.filer_id, 
        f1.transaction_date AS transaction_date1, 
        MAX(f2.transaction_date) AS transaction_date2, 
        TIMESTAMPDIFF(YEAR, MAX(f2.transaction_date), f1.transaction_date) AS year_diff
FROM    fact_insider_sales f1
        LEFT JOIN fact_insider_sales f2
            ON f1.filer_id = f2.filer_id
            AND f2.transaction_date < f1.transaction_date
GROUP BY f1.id, f1.filer_id, f1.transaction_date;

然后在查询中加入视图,只需选择 id 在哪里 year_diff is>=10年:

SELECT 
e.stock_name,     
e.stock_id,
f.ticker_id,
f.ticker_name,
a.transaction_date,
d.filer_name,
b.relationship_name,
b.relationship_id
FROM fact_insider_sales as a 
join dim_relationship as b ON (a.relationship_id = b.relationship_id)
join dim_filer as d on (a.filer_id = d.filer_id)
join dim_stock as e on (a.stock_id = e.stock_id)
join dim_ticker as f ON (a.ticker_id = f.ticker_id)
JOIN sales_date_diff s ON a.id = s.id
WHERE s.year_diff >= 10
and b.relationship_name IN ('CEO', 'CB')

相关问题