我如何获得最新的 tm.detail_notes(tm.detail_notes for max(tm.timeslip_date))?

How do I get the lates tm.detail_notes ( tm.detail_notes for max(tm.timeslip_date))?

我有一个 return 一些记录的查询,但我需要获取 max(tm.timeslip_date) 上的最新 tm.detail_notes。现在我收到一个错误。 (我在 table 上有多个记录日期并且每天都有注释)

查询

SELECT
      min(tm.create_date) 'Created Date'
    , max(tm.timeslip_date) 'Last Bill Date'
    , cases.case_sk
    , cases.case_number
    , cases.closed_ind
    , cases.atty2_sk
    , vc.atty2_name 'Business Leader'
    , em.smtp_reply_to 'Business Leader Email'
    , cases.atty1_sk
    , vc.atty1_name 'Assign Attorney'
    , tm.detail_notes
FROM dbo.cases
LEFT JOIN dbo.vcases vc ON cases.case_sk = vc.case_sk
LEFT JOIN dbo.employee em ON cases.atty2_sk = em.employee_sk    
LEFT JOIN dbo.timeslips tm ON cases.case_sk = tm.case_sk
WHERE 
      cases.case_number = '0130751-KMG' 
      AND tm.timeslip_date <= DATEADD(day, -90, GETDATE())
      AND cases.closed_ind = 'O'
GROUP BY 
      cases.case_sk
    , cases.case_number
    , cases.closed_ind
    , cases.atty2_sk
    , vc.atty2_name 
    , em.smtp_reply_to 
    , cases.atty1_sk
    , vc.atty1_name
    , tm.detail_notes

错误

文本、下一个和图像数据类型无法进行比较或排序,除非使用 IS NULL 或 LIKE 运算符。

我将非常感谢对此的任何帮助。最后,任何人都可以证实我的逻辑,我正在尝试获取过去 90 天内没有 tm.timeslip_date 的案例。按照tm.timeslip_date <= DATEADD(day, -90, GETDATE())这个逻辑应该能搞定吧。

非常感谢

不知道更多 tm.detail_notes 似乎是一个 text 列,它是大型 open-ended 数据类型的特殊列之一。请参阅 ntext, text, and image (Transact-SQL). These fields cannot be used in columns expressions 的聚合查询 GROUP BY

要将 text 字段合并到聚合中,请考虑使用两个相关的 CTE 进行单元级别和聚合级别的联接。然后,最终查询会将文本列绑定到在 Last Bill Date.

处连接的聚合
WITH unit AS (
   -- NO AGGREGATIONS
   SELECT
         tm.create_date 
       , tm.timeslip_date
       , cases.case_sk
       , cases.case_number
       , cases.closed_ind
       , cases.atty2_sk
       , vc.atty2_name    AS [Business Leader]
       , em.smtp_reply_to AS [Business Leader Email]
       , cases.atty1_sk
       , vc.atty1_name    AS [Assign Attorney]
       , tm.detail_notes
   FROM dbo.cases
   LEFT JOIN dbo.vcases vc ON cases.case_sk = vc.case_sk
   LEFT JOIN dbo.employee em ON cases.atty2_sk = em.employee_sk    
   LEFT JOIN dbo.timeslips tm 
         ON cases.case_sk = tm.case_sk
         AND tm.timeslip_date <= DATEADD(day, -90, GETDATE()) -- MOVED FROM WHERE TO ON CLAUSE
   WHERE cases.case_number = '0130751-KMG'
     AND cases.closed_ind = 'O'
), agg AS (
   -- NO JOINS / WHERE
   SELECT
         MIN(u.create_date)   AS [Created Date]
       , MAX(u.timeslip_date) AS [Last Bill Date]
       , u.case_sk
       , u.case_number
       , u.closed_ind
       , u.atty2_sk
       , u.[Business Leader]
       , u.[Business Leader Email]
       , u.atty1_sk
       , u.[Assign Attorney]
   FROM unit u
   GROUP BY 
         u.case_sk
       , u.case_number
       , u.closed_ind
       , u.atty2_sk
       , u.[Business Leader]
       , u.[Business Leader Email]
       , u.atty1_sk
       , u.[Assign Attorney]
)

-- FINAL QUERY JOINING ON GROUP COLUMNS AND AGG DATES
SELECT agg.*, unit.detail_notes
FROM agg
INNER JOIN unit
   ON  agg.case_sk = unit.case_sk
   AND agg.case_number = unit.case_number
   AND agg.closed_ind = unit.closed_ind
   AND agg.atty2_sk = unit.atty2_sk
   AND agg.[Business Leader] = unit.[Business Leader]
   AND agg.[Business Leader Email] = unit.[Business Leader Email]
   AND agg.atty1_sk = unit.atty1_sk
   AND agg.[Assign Attorney] = unit.[Assign Attorney]  

   AND agg.[Created Date] = unit.[create_date]
   AND agg.[Last Bill Date] = unit.[timeslip_date]