SQL-查询以获取最大日期低于特定日期的行

问题描述 投票:0回答:2

抱歉,我无法在标题中更好地解释这一点。这基本上是我需要完成的任务:

Entity table: entity_id

BenchHistory table: entity_id, bench_id, bench_effective_date

Summary table: entity_id, effective_date

简而言之,这就是数据库布局。此查询从

effective_date
表中查找每个实体的
Summary
。它还需要查找该特定日期的
bench_id
,方法是查看
BenchHistory
表并找到小于
bench_effective_date
的最大
effective_date
,其中
BenchHistory.entity_id = Entity.entity_id

这是我所拥有的:

SELECT
    Entity.entity_id
    Summary.effective_date
    BenchHistory.bench_id
FROM
    Entity
JOIN Summary ON Entity.entity_id = Summary.entity_id
JOIN BenchHistory ON Entity.entity_id = BenchHistory.entity_id

很简单,长凳部分是我遇到问题的地方。如何仅选择一个

BenchHistory.bench_id
,它必须是相对于
Summary.effective_date
最新的?

为了清楚起见,每个实体都有许多对应的

effective_dates
和许多对应的
bench_ids
,但一次只有一个
bench_id
可以“有效”(最近的一个)。我试图根据该行的
bench_id
找到每一行的“有效”
effective_date
。我需要通过确定哪个
bench_id
bench_effective_date
小于
effective_date
来做到这一点。

这是我的一个查询示例,也许这样会更容易可视化。

SELECT
    Entity.entity_id
    BenchHistory.bench_id
    Summary.effective_date
    BenchHistory.bench_effective_date
FROM
    Entity
JOIN Summary ON Entity.entity_id = Summary.entity_id
JOIN BenchHistory ON Entity.entity_id = BenchHistory.entity_id

这将给出如下输出:

entity_id    bench_id    effective_date    bench_effective_date
1            120         1/31/2011         6/30/2003
1            121         1/31/2011         3/22/2005
1            122         1/31/2011         11/03/2008
1            123         1/31/2011         1/21/2011
1            124         12/30/2010        5/15/2010
1            125         12/30/2010        10/06/2010

我想要抓取的只是 1/31 的

bench_id
123,因为它是
entity_id = 1
的最新板凳和 12/30 的
bench_id
125 等。所以结果集:

entity_id    bench_id    effective_date    bench_effective_date
1            123         1/31/2011         1/21/2011
1            125         12/30/2010        10/06/2010

谢谢,抱歉,如果这是一个简单的问题,但我已经花了 6 个小时来尝试各种子查询、聚合、GROUP BY 等。我对 SQL 不太有经验。

:)

sql greatest-n-per-group
2个回答
3
投票

这不是一个简单的问题,也花了我很多时间。基本上与 Mysql - Need to getlate of table A when referenced from table B 相同的问题,并且与 mysql 功能请求相关 http://bugs.mysql.com/bug.php?id=2020 ,请参阅获取信息。

也许对您来说最简单的是遵循这个示例:

假设您有每个商店每种商品的价格表。对于每种商品,您希望查看最低价格和相关商店,您可以在其中以该价格购买该商品!与您的示例完全相同 - 您想要一条具有最大修订版本的记录。

create table prices ( goods varchar(10), price double, store varchar(10) );

insert into prices values ('car', 200, 'Amazon'), ('car', 150, 'CarStore'), ('Bread', 2, 'Baker1'), ('Bread', 1, 'Baker2');

select goods, min(price), 
    (select store 
     from prices as p 
     where p.goods = prices.goods
     order by price limit 1) as store
from prices
group by goods;

1
投票

因此您只想

JOIN
最大日期小于摘要的工作台表

SELECT
    Entity.entity_id
    ,BenchHistory.bench_id
    ,Summary.effective_date
    ,BenchHistory.bench_effective_date
FROM
    Entity
JOIN Summary 
    ON Summary.entity_id = Entity.entity_id
JOIN BenchHistory 
    ON BenchHistory.bench_id IN
        (
        SELECT TOP 1
            z.bench_id
        FROM
            BenchHistory z
        WHERE 
            z.entity_id = Summary.entity_id
            AND z.bench_effective_date <= Summary.effective_date
        ORDER BY
            z.bench_effective_date DESC
        )

另一方面,如果您想完全排除任何日期大于 effective_date 的替补席,您可以使用

HAVING
子句,如果是这种情况,请告知....

© www.soinside.com 2019 - 2024. All rights reserved.