【问题标题】:SQL Oracle---get last record for every monthSQL Oracle---获取每个月的最后一条记录
【发布时间】:2011-12-17 14:48:46
【问题描述】:

我有一个包含一些检验数据的表。每个商品都需要每月检查一次。这里的目标是找到每个月最后一次检查的记录。

餐桌检查:

INSPECTION_I--------INSPECTION_TS

200--------------- 2011 年 10 月 20 日

201----------------------------10/24/2011

202----------------------------10/26/2011

Table Product_Inspection:

INSPECTION_I---ASSET_I

200------------------------------------------------1000

201------------------------------------------------2000

Table Box_Inspection

INSPECTION_I--------ASSET_I

202------------------------3000

餐桌产品

ASSET_I------------ASSOCIATED_BOX_ASSET_I

1000---------------3000

表格框:

ASSET_I------------OTHER_STUFF

3000--------------------#####

现在在这种情况下,我想要的是 201 而不是 200。我试图做 MAX(to_char(inspection_ts, 'mm/yyyy')) 但这没有帮助。还有一个问题。出于某种原因,在一个月内对产品或盒子进行两次或更多次检查的情况下,我会一直使用笛卡尔坐标系。我想要的只是每个月进行一次检查,并且应该是每个月的最后一次检查。我真的很接近得到它,但如果有人可以提供帮助,我将非常感激。我能够通过嵌套光标完成它,但我不希望这样做。

【问题讨论】:

    标签: sql oracle stored-procedures plsql


    【解决方案1】:

    使用子查询

    Select [ColName List]
    From TableName a
    Where DateTimeColumname 
       = (Select Max(DateTimeColumnName)
          From TableName 
          Where DateTimeColumnName < 1+Last_Day(a.DateTimeColumnName))
    

    【讨论】:

      【解决方案2】:

      我倾向于使用分析函数来进行这种查询。比如:

      with data as
      (
          select 1 product_id, 100 inspection_id, to_date('09/04/2011', 'MM/DD/YYYY') inspection_date from dual union all
          select 1 product_id, 101 inspection_id, to_date('09/14/2011', 'MM/DD/YYYY') inspection_date from dual union all
          select 1 product_id, 103 inspection_id, to_date('10/04/2011', 'MM/DD/YYYY') inspection_date from dual union all
          select 1 product_id, 105 inspection_id, to_date('11/01/2011', 'MM/DD/YYYY') inspection_date from dual union all
          select 2 product_id, 102 inspection_id, to_date('09/24/2011', 'MM/DD/YYYY') inspection_date from dual union all
          select 2 product_id, 104 inspection_id, to_date('10/05/2011', 'MM/DD/YYYY') inspection_date from dual
      )
      select *
      from 
      (
          select
              product_id,
              inspection_id,
              inspection_date,
              row_number() over (
                  partition by
                      product_id,
                      trunc(inspection_date, 'MM') -- Month
                  order by
                      inspection_date desc
              ) rn
          from
              data
      )
      where rn = 1 -- indicates last inspection date of the month for each product
      

      【讨论】:

      • 嘿 Craig,我没有使用过分析函数,但它似乎绝对值得一看。只是为了让您知道,我还在我的 SP 中获取了一个输入参数,并返回了一个我在 Java DAO 层中获取的游标。因此,它是一个动态 SQL 字符串。如果我走这条路,这会与我当前的 SP 集成吗?
      • 是的,这应该能够为您的 SP 工作,假设您至少在 9i 中。如果您对如何使用它有任何疑问,请告诉我。
      猜你喜欢
      • 1970-01-01
      • 2017-02-19
      • 2020-10-01
      • 1970-01-01
      • 2022-12-07
      • 2022-10-14
      • 1970-01-01
      • 2021-01-23
      • 2018-11-21
      相关资源
      最近更新 更多