【问题标题】:Filtering rows that have same value in column but different max date过滤列中具有相同值但最大日期不同的行
【发布时间】:2017-06-09 16:37:22
【问题描述】:

我有一个返回结果的查询。

    declare @value varchar(500) = 1

    SELECT cnb.ndc_id
        ,cnb.contract_num_val
        ,cnb.quote_price
        ,CONVERT(VARCHAR(10), cnb.eff_dt, 101) AS 'eff_dt'
        ,cnb.discount_pct
        ,cnb.rebate_pct
        ,cnb.award_type
        ,cnb.contract_ndc_brg_id
        ,(
            SELECT SUBSTRING((
                        SELECT ',' + gm.item_name AS [text()]
                        FROM GM_PROGRAM gm
                        JOIN [CONTRACT_ATTR] ca ON ca.[ATTR_VAL] = gm.Item_Id
                        WHERE field_id = 239
                            AND ca.item_id = (
                                SELECT item_id
                                FROM [CONTRACT_ATTR]
                                WHERE attr_val = cnb.contract_num_val
                                    AND field_id = 413
                                )
                        FOR XML PATH('')
                        ), 2, 1000)
            ) AS 'programs'
    FROM [ndc_attr] ndc
    INNER JOIN contract_ndc_brg cnb ON ndc.attr_val = cnb.ndc_id
    WHERE ndc.field_id = 69

我正在尝试添加一个过滤器,其中对于每个唯一的 contract_num_val 它只会返回具有最高日期的那个。

首先我尝试在CONVERT(VARCHAR(10), cnb.eff_dt, 101) 周围添加MAX(),然后添加一个group by 子句。但它不会运行,除非我将所有内容都添加到组中,然后它只会返回相同的结果。

然后看这里,我尝试做一个更简单的选择,我可以用它来取回我需要过滤的键。基于此:SQL Select only rows with Max Value on a Column

这又一次没有运行:

select contract_ndc_brg_id, max(eff_dt) from contract_ndc_brg group by contract_num_val

我必须将 contract_ndc_brg_id 添加到组中,然后它才会返回所有内容。

我做错了什么,我该如何解决?

【问题讨论】:

  • eff_dt是什么数据类型?
  • @DJSweetness 这是约会。

标签: sql sql-server


【解决方案1】:

添加这个内部连接

inner join
(select contract_num_val, max(eff_dt) dt 
from  contract_ndc_brg 
group by contract_num_val) cnb2 on cnb2.dt = cnb.eff_dt and cnb2.contract_num_val =cnb.contract_num_val

【讨论】:

    【解决方案2】:

    使用cross apply()

    declare @value varchar(500) = 1
    
    select cnb.ndc_id
      , cnb.contract_num_val
      , cnb.quote_price
      , convert(varchar(10), cnb.eff_dt, 101) as 'eff_dt'
      , cnb.discount_pct
      , cnb.rebate_pct
      , cnb.award_type
      , cnb.contract_ndc_brg_id
      , (
      select substring((
         select ',' + gm.item_name as [text()]
         from gm_program gm
         inner join [contract_attr] ca on ca.[attr_val] = gm.Item_Id
         where field_id = 239 and ca.item_id = (
           select item_id
           from [contract_attr]
           where attr_val = cnb.contract_num_val and field_id = 413
           )
         for xml path('')
         ), 2, 1000)
      ) as 'programs'
    from [ndc_attr] ndc
      cross apply (
        select top 1 *
        from contract_ndc_brg i 
        where ndc.attr_val = i.ndc_id
        order by i.eff_dt desc
        ) cnb
    where ndc.field_id = 69
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 2021-05-04
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多