【问题标题】:SQL Server : smallest ROW_NUM in where condition, with subgroup pre-conditionSQL Server:where条件中最小的ROW_NUM,带有子组前置条件
【发布时间】:2020-11-19 16:21:50
【问题描述】:

提前谢谢大家!我试图尽可能清楚地描述这一点。

我有两个子表,第一个表检索Comfirmed_Date,第二个表检索Mail_Date,条件为Mail_Date >= Comfirmed_Date

select
    a.ID
    ,g.ROWNUM
    ,f.CORM_DT
    ,g.MAIL_DT
from 
    SOURCE_U a
left join 
    (select 
         a.SOURCE_ID
         , Max(Cast(b.ATUF_DATE3 as date)) as [CORM_DT]
     from
         ATTACH_U a
     inner join 
         USERFLD_D b on a.DEST_CK = b.DEST_CK 
     group by 
         a.SOURCE_ID) f on f.SOURCE_ID = a.SOURCE_ID 
left join 
    (select 
         a.SOURCE_ID
         , cast(b.MAILED_DT as date) as MAIL_DT
         , row_number() over (partition by SOURCE_ID order by CREATE_DT) as ROWNUM
     from 
         ATTACH_U a
     left join 
         LETTER_D b on b.DEST_CK = a.DEST_CK) g on g.SOURCE_ID = a.SOURCE_ID 
                                                and g.MAIL_DT >= f.CORM_DT

我需要表格的第一行(最小的row_num),我该如何实现?

原来我觉得我可以做出类似的条件

where g.ROWNUM = 1

但是因为我在联表上有条件,所以下面的情况就不行了。

ID              gROWNUM             CORM_DT                   MAIL_DT 
1001               3                2020-10-20                2020-10-22               
1001               4                2020-10-20                2020-10-30
1002               2                2020-10-20                2020-10-21               
1002               3                2020-10-20                2020-10-23
1002               4                2020-10-20                2020-10-28               
1003               1                2020-10-20                2020-10-30
1004               1                2020-10-20                2020-10-21               
1004               2                2020-10-20                2020-10-23
1005               4                2020-10-20                2020-10-28               
1006               1                2020-10-20                2020-10-30

我只想在这里为每个 ID 写一行。

【问题讨论】:

  • gROWNUMSELECT TOP 1...排序
  • @CriticalError 很抱歉我还是没说清楚,它包含多个 ID...

标签: sql sql-server sql-server-2012 logic row-number


【解决方案1】:

试试这个:

SELECT TOP 1
    a.ID
    , g.ROWNUM
    , f.CORM_DT
    , g.MAIL_DT
FROM SOURCE_U a 
LEFT JOIN (
    SELECT 
        a.SOURCE_ID
        , Max(Cast(b.ATUF_DATE3 as date)) as [CORM_DT]
    FROM ATTACH_U a
    INNER JOIN USERFLD_D b 
        ON a.DEST_CK = b.DEST_CK 
    GROUP BY a.SOURCE_ID
    
) f 
    ON f.SOURCE_ID = a.SOURCE_ID 
LEFT JOIN (

    SELECT 
        a.SOURCE_ID
        , CAST( b.MAILED_DT AS date) AS MAIL_DT
        , ROW_NUMBER() OVER( PARTITION BY SOURCE_ID ORDER BY CREATE_DT ) AS ROWNUM
    FROM ATTACH_U a
    LEFT JOIN LETTER_D b 
        ON b.DEST_CK = a.DEST_CK

) g
    ON g.SOURCE_ID = a.SOURCE_ID 
    AND g.MAIL_DT >= f.CORM_DT
ORDER BY
    g.ROWNUM;

【讨论】:

  • 谢谢,很抱歉我还没有说清楚,它包含多个 ID。我正在重新编辑我的问题
【解决方案2】:

你只需要一个窗口函数在你的选择中。

select rows, columns... from (
select dense_rank() over ( partition by a.ID order by MAIL_DT) as rows, columns...
...
)
where rows = 1

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 2013-06-14
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多