选择交易作为单行

Posted

技术标签:

【中文标题】选择交易作为单行【英文标题】:Selecting transactions as a single row 【发布时间】:2009-10-20 16:18:55 【问题描述】:

我有一个需求,我需要生成一份关于当前软件项目的报告。其中两列是最新里程碑的日期和之前里程碑的日期。显然,里程碑存储在事务表中,因此每个项目可以有多个里程碑。

到目前为止,我已经到了这里,但现在我遇到了问题:

select  proj.*
from zsof_projects proj
join zsof_milestones current_milestone on current_milestone.product_id = proj.id
join zsof_milestones last_milestone on last_milestone.product_id = proj.id
join    (
        select product_id, max(actual_date) maxDate
        from zsof_milestones
        group by product_id
        ) a on a.product_id = current_milestone.product_id and a.maxDate = current_milestone.actual_date
join    (
        select mile.product_id, max(actual_date) maxDate
        from zsof_milestones mile
        join    (
                select product_id, max(actual_date) maxDate
                from zsof_milestones
                group by product_id
                ) a on a.product_id = mile.product_id and mile.actual_date < a.maxDate
        group by mile.product_id
        ) b on b.product_id = last_milestone.product_id and b.maxDate = last_milestone.actual_date
order by proj.id;

我遇到的问题是,并非所有项目都会有一个最新的里程碑,也不是所有的项目都会有多个里程碑。我已经尝试过左连接,但后来我得到了每个项目的多行(这是我需要避免的)。

我使用的是 Oracle 10,所以如果我可以在 PL/SQL 中使用某些东西,我也会使用它。

【问题讨论】:

【参考方案1】:

使用分析:)

SELECT v.*
  FROM (SELECT proj.*, actual_date, 
               MAX(actual_date) over(PARTITION BY ms.product_id) last_milestone,
               lag(actual_date) over(PARTITION BY ms.product_id 
                                     ORDER BY actual_date) previous_milestone
           FROM zsof_projects proj
           LEFT JOIN zsof_milestones ms ON ms.product_id = proj.id) v
 WHERE last_milestone = actual_date
    OR (actual_date IS NULL AND last_milestone IS NULL)

更新:我将 JOIN 转换为 LEFT JOIN,以防项目没有里程碑。

【讨论】:

谢谢!这很好用。我还没有看到你在那里使用的一些功能,所以看起来我有一些阅读要做。

以上是关于选择交易作为单行的主要内容,如果未能解决你的问题,请参考以下文章

期货程序化交易软件哪个比较好

使用聚合查询获取具有总交易计数和交易详细信息的用户列表作为嵌入文档

区块链交易系统开发,区块链系统开发公司

区块链交易所开发,区块链系统开发公司

Groupon 之类的网站如何根据有交易的城市来划分地理位置?

星云链智能合约开发:在星云链上发送交易