【问题标题】:SQL oracle with joining tables and Max functions具有连接表和 Max 函数的 SQL oracle
【发布时间】:2016-08-20 01:27:49
【问题描述】:

请帮忙?这里只是一个菜鸟,开始学习如何编写 SQL 并遇到了这个问题。我知道如何使用MAX 函数,但我不知道如何将所有这些要求结合在一起。我有两张表,AccountsBooks(下面是数据示例)

Accounts                                       
ID Series   YesorNot    Dated Filed     Plan Year       
1   123     Yes         06/12/2015      2015        
2   123     No          06/12/2015      2015        
3   145     Yes         06/06/2015      2015
4   145     No          02/02/2015      2014        
5   198     Yes         02/03/2015      2015        
6   187     Yes         02/14/2013      2013            
7   153     Yes         01/02/2011      2011        

Books       
Primary Key Date Created    ID
1           06/13/2015      123
2           06/12/2015      123
3           06/07/2015      145
4           02/02/2015      145
5           02/03/2015      198

两个表:AccountsBooks
寻找:
1. 按项目 ID = 主键存在于两个表中的数据
2.我只想要一个unqiue系列(系列也=ID)
3. 我想要 Plan Year 的 MAX(最近)值,然后如果 Plan Year 有重复项,我需要 Date Created 的 MAX(最近)值。
4. 我只需要Project IDSeriesYesorNotDate FiledPlan Year 列,所以我的输出应该是这样的:

Project ID  Series  YesorNot  Dated Filed Plan Year     
1           123     Yes       06/12/2015  2015          
3           145     Yes       06/06/2015  2015          
4           145     No        02/02/2015  2014          
5           198     Yes       02/03/2015  2015  

【问题讨论】:

  • 如果不创建临时表集并且可能有一些输出,这很难做到(由于条件 3)。如果 YesOrNot = No 是否总是表示 Accounts with the same Plan Year 中同一系列的多行?
  • “项目 ID = 主键同时存在于两个表中的数据”是什么意思?什么是项目 ID?那么 - 这两个表不是由第一个表中的 Series 和第二个表中的 ID 匹配吗?我希望您的表格不会被超过一对列“匹配”!
  • @BenHamilton - 你熟悉分析函数吗?
  • @mathguy 不,我不确定它们是否可以在我使用过的主要 DBMS 的 Ingres 中使用。 OP 正在使用 Oracle,但我从未使用过它。
  • @Tiffanyyim - 如果按计划年份出现平局,并且“系列”没有出现在 Books 表中会怎样?

标签: sql oracle


【解决方案1】:

首先加入表格:

SELECT B.Primary_Key as Project_ID, A.Series, A.YesorNot, A.Date_Filed, A.Plan_Year
FROM Books B
JOIN Accounts A ON B.ID = A.Series

您应该能够自己做到这一点(并且您应该将其作为问题的一部分发布)——如果您不能,我会说找一个不同的职业。假设您现在可以完成稍微困难的部分。

现在我们根据您的条件添加行号

ROW_NUMBER() PARTITION BY (B.Primary_Key, A.Series, A.YesorNot, A.Date_Filed ORDER BY A.Date_Year DESC, B.Date_Created DESC) AS RN

现在只取第一个行号。

SELECT Project_ID, Series, YesorNot, Date_Filed, Plan_Year
FROM (
  SELECT B.Primary_Key as Project_ID, A.Series, A.YesorNot, A.Date_Filed, A.Plan_Year,
         ROW_NUMBER() PARTITION BY (B.Primary_Key, A.Series, A.YesorNot, A.Date_Filed ORDER BY A.Date_Year DESC, B.Date_Created DESC) AS RN
  FROM Books B
  JOIN Accounts A ON B.ID = A.Series
) X
WHERE RN = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2015-01-23
    • 2023-03-27
    相关资源
    最近更新 更多