【问题标题】:Using ROW_NUMBER() with a derived table将 ROW_NUMBER() 与派生表一起使用
【发布时间】:2018-12-21 18:42:36
【问题描述】:

我有一个表,我在其中返回一个 ID 和一个 DATEDIFF 值:

SELECT        
    CTD_ITEM_ID, CTD_ASSIGNED_TO, 
    DATEDIFF(d, CTD_ASSIGNED_DATE, CTD_REVIEW_COMPLETED_DATE) AS DATE_DIFF
FROM            
    IRT_ITEM_TRACKING_DETAIL_TBL
ORDER BY 
    CTD_ITEM_ID, DATE_DIFF DESC

这导致相同的ctd_item_id 的许多date_diff 值。

据此,我希望创建一个表,其中为每个ctd_item_id 保留最大的date_diff。因此,我应该使用 ROW_NUMBER() - 但我不确定如何将上述值的创建 (date_diff) 与 ROW_NUMBER() 功能结合起来。

我已经尝试过多次这样的迭代:

WITH max_date_diffs AS 
( 
    SELECT 
        date_diffs.ctd_item_id, 
        date_diffs.date_diff 
    FROM   
        (SELECT 
             ctd_item_id, 
             DATEDIFF(d, ctd_assigned_date, ctd_review_complete_date) AS datediff 
         FROM   
             irt_item_tracking_detail_tbl) AS date_diffs
) 
SELECT   
    ROW_NUMBER() OVER ctd_item_id (ORDER BY date_diff DESC) AS rownumber, 
    * 
FROM
    max_date_diffs

但我无法让它工作。

编辑:

此声明:

SELECT        
    CTD_ITEM_ID, CTD_ASSIGNED_TO, 
    MAX(DATEDIFF(DAY, CTD_ASSIGNED_DATE, CTD_REVIEW_COMPLETED_DATE)) AS MAX_DATE_DIFF
FROM
    IRT_ITEM_TRACKING_DETAIL_TBL
GROUP BY 
    CTD_ITEM_ID, CTD_ASSIGNED_TO
ORDER BY 
    CTD_ITEM_ID, max_date_diff DESC

返回一个像这样的表:

但我只想要以黄色突出显示的行,这就是为什么我觉得在这个表上我需要执行ROW_NUMBER()

【问题讨论】:

  • (1) 用您正在使用的数据库标记您的问题。 (2) 你的第一个查询不应该在任何数据库中工作,因为表达式和group by 不兼容。
  • 已修复。感谢您的关注。

标签: sql sql-server reporting-services


【解决方案1】:

好像你错过了PARTITION BY ctd_item_id

试试:

SELECT ctd_item_id,
       ctd_assigned_to,
       max_date_diff
       FROM (SELECT ctd_item_id,
                    ctd_assigned_to,
                    max(datediff(day, ctd_assigned_date, ctd_review_completed_date)) max_date_diff,
                    row_number() OVER (PARTITION BY ctd_item_id,
                                       ORDER BY max(datediff(day, ctd_assigned_date, ctd_review_completed_date)) DESC) rn
                    FROM irt_item_tracking_detail_tbl
                    GROUP BY ctd_item_id,
                             ctd_assigned_to) x
       WHERE rn = 1
       ORDER BY ctd_item_id ASC,
                max_date_diff DESC;

【讨论】:

    【解决方案2】:

    您似乎想要一个聚合查询:

    SELECT ctd_item_id, 
           MAX(DATEDIFF(DAY, ctd_assigned_date, ctd_review_completed_date)) AS MAX_DATE_DIFF
    FROM irt_item_tracking_detail_tbl 
    GROUP BY ctd_item_id 
    ORDER BY max_date_diff ;
    

    【讨论】:

    • 我已根据您的回答编辑了问题以提供更多详细信息。
    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多