Sql 带有where子句的最大日期

Sql 带有where子句的最大日期,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有以下疑问: SELECT cst_recno as [Member ID], cmc_end_date as 'Last Term End date as a Trustee', ind_first_name as 'Last Name', ind_mid_name as 'First Name', ind_last_name as 'Last Name', cst_ixo_title_dn as 'title', cst_org_na

我有以下疑问:

SELECT
    cst_recno as [Member ID],
    cmc_end_date as 'Last Term End date as a Trustee',
    ind_first_name as 'Last Name',
    ind_mid_name as 'First Name',
    ind_last_name as 'Last Name',
    cst_ixo_title_dn as 'title',
    cst_org_name_dn as 'organization',
    adr_country as 'Country',
    adr_city as 'City',
    adr_state as 'State',
    cst_eml_address_dn as 'Email'
FROM mb_committee_x_customer  
JOIN co_customer ON cst_key=cmc_cst_key 
JOIN mb_committee ON cmt_key=cmc_cmt_key 
JOIN co_individual ON ind_cst_key=cmc_cst_key 
LEFT JOIN co_customer_x_address ON cmc_cxa_key=cxa_key 
LEFT JOIN co_address ON cxa_adr_key = adr_key 
WHERE cmc_end_date <= '9/6/2017' 
AND ind_deceased_flag != 1 
AND cmt_code = N'T'
ORDER BY cst_recno
我希望获得每个成员id的最早日期,因此我的结果集如下所示:

MemberID    Last Term End Date as a Trustee         Last Name
1004        2008-06-30                              Smith
您可以使用:

您可以使用:

使用行号标识每个成员ID的最新记录:

使用行号标识每个成员ID的最新记录:


<>这可能对性能有更好的影响,需要考虑的是-/P> 假设第一个查询执行得很好,您可能希望将该结果集抛出到临时表中,然后运行一个查询,将临时表中的数据分组。如果需要,可以将索引添加到临时表中。但下面的方法应该有效

SELECT cst_recno as [Member ID],
       cmc_end_date as 'Last Term End date as a Trustee',
       ind_first_name as 'Last Name',
       ind_mid_name as 'First Name',
       ind_last_name as 'Last Name',
       cst_ixo_title_dn as 'title',
       cst_org_name_dn as 'organization',
       adr_country as 'Country',
       adr_city as 'City',
       adr_state as 'State',
       cst_eml_address_dn as 'Email'
  INTO #tempTable
  FROM mb_committee_x_customer  
  JOIN co_customer 
    ON cst_key=cmc_cst_key 
  JOIN mb_committee 
    ON cmt_key=cmc_cmt_key 
  JOIN co_individual 
    ON ind_cst_key=cmc_cst_key 
  LEFT JOIN co_customer_x_address 
    ON cmc_cxa_key=cxa_key 
  LEFT JOIN co_address 
    ON cxa_adr_key = adr_key 
 WHERE cmc_end_date <= '9/6/2017' 
   AND ind_deceased_flag != 1 
   AND cmt_code = N'T'
 ORDER BY cst_recno

;WITH CTE ([Last Term End date as a Trustee], [Last Name])
AS
 (SELECT MAX([Last Term End date as a Trustee]),                
        [Last Name]
   FROM #tempTable
  GROUP BY [Last Name])

SELECT tt.[Member ID],
       c.[Last Term End date as a Trustee],
       c.[Last Name]
  FROM CTE c
  JOIN #tempTable tt
    ON c.[Last Term End date as a Trustee] = tt.[Last Term End date as a Trustee]
   AND c.[Last Name] = tt.[Last Name]

<>这可能对性能有更好的影响,需要考虑的是-/P> 假设第一个查询执行得很好,您可能希望将该结果集抛出到临时表中,然后运行一个查询,将临时表中的数据分组。如果需要,可以将索引添加到临时表中。但下面的方法应该有效

SELECT cst_recno as [Member ID],
       cmc_end_date as 'Last Term End date as a Trustee',
       ind_first_name as 'Last Name',
       ind_mid_name as 'First Name',
       ind_last_name as 'Last Name',
       cst_ixo_title_dn as 'title',
       cst_org_name_dn as 'organization',
       adr_country as 'Country',
       adr_city as 'City',
       adr_state as 'State',
       cst_eml_address_dn as 'Email'
  INTO #tempTable
  FROM mb_committee_x_customer  
  JOIN co_customer 
    ON cst_key=cmc_cst_key 
  JOIN mb_committee 
    ON cmt_key=cmc_cmt_key 
  JOIN co_individual 
    ON ind_cst_key=cmc_cst_key 
  LEFT JOIN co_customer_x_address 
    ON cmc_cxa_key=cxa_key 
  LEFT JOIN co_address 
    ON cxa_adr_key = adr_key 
 WHERE cmc_end_date <= '9/6/2017' 
   AND ind_deceased_flag != 1 
   AND cmt_code = N'T'
 ORDER BY cst_recno

;WITH CTE ([Last Term End date as a Trustee], [Last Name])
AS
 (SELECT MAX([Last Term End date as a Trustee]),                
        [Last Name]
   FROM #tempTable
  GROUP BY [Last Name])

SELECT tt.[Member ID],
       c.[Last Term End date as a Trustee],
       c.[Last Name]
  FROM CTE c
  JOIN #tempTable tt
    ON c.[Last Term End date as a Trustee] = tt.[Last Term End date as a Trustee]
   AND c.[Last Name] = tt.[Last Name]

在这种情况下有效。但是,如果select的任何其他列在两个日期之间发生更改,该怎么办?就像加了一个标题。我甚至不确定它在这种情况下是否有效。。也许OP只是为我们简化了它,我们只看到了11列中的3列@EstebanP,我们需要问问OP是否可以。这是基于样本数据和期望结果的解决方案。在这种情况下,一种方法是为每个memberId创建一个具有最大日期的结果集,然后在memberId和max_cmc_end_date或@sagi's way上使用row number函数将现有查询与该结果集连接起来:其余列是相同的。唯一的区别是在“结束日期”列中。我使用了GROUPBY和max函数,效果非常好。我不知道之前我在做什么,以前没用过。谢谢大家对本案的评论。但是,如果select的任何其他列在两个日期之间发生更改,该怎么办?就像加了一个标题。我甚至不确定它在这种情况下是否有效。。也许OP只是为我们简化了它,我们只看到了11列中的3列@EstebanP,我们需要问问OP是否可以。这是基于样本数据和期望结果的解决方案。在这种情况下,一种方法是为每个memberId创建一个具有最大日期的结果集,然后在memberId和max_cmc_end_date或@sagi's way上使用row number函数将现有查询与该结果集连接起来:其余列是相同的。唯一的区别是在“结束日期”列中。我使用了GROUPBY和max函数,效果非常好。我不知道之前我在做什么,以前没用过。谢谢大家的评论谢谢你们非常喜欢窗口功能。它们非常高效,而且非常灵活。非常感谢您喜欢的窗口功能。它们非常高效且非常灵活。cmc_end_date字段位于哪里?你没有在问题中加上表格别名我会回应Eli的。这些田地是从哪里来的?别名使代码更加清晰。此外,cmt_代码是否包含UNICODE字符?那个区域是nvarchar还是nchar?如果不是,则不需要使用N强制转换值。cmc_end_date字段在哪里有效?你没有在问题中加上表格别名我会回应Eli的。这些田地是从哪里来的?别名使代码更加清晰。此外,cmt_代码是否包含UNICODE字符?那个区域是nvarchar还是nchar?如果不是,则不需要使用N来强制转换该值。
SELECT t.* 
FROM(SELECT ROW_NUMBER() OVER(PARTITION BY s.memberID ORDER BY cmc_end_date DESC) as rnk,
            cst_recno as [Member ID],
            cmc_end_date as 'Last Term End date as a Trustee',
            ind_first_name as 'Last Name',
            ind_mid_name as 'First Name',
            ind_last_name as 'Last Name',
            cst_ixo_title_dn as 'title',
            cst_org_name_dn as 'organization',
            adr_country as 'Country',
            adr_city as 'City',
            adr_state as 'State',
            cst_eml_address_dn as 'Email'
     FROM mb_committee_x_customer  
     JOIN co_customer ON cst_key=cmc_cst_key 
     JOIN mb_committee ON cmt_key=cmc_cmt_key 
     JOIN co_individual ON ind_cst_key=cmc_cst_key 
     LEFT JOIN co_customer_x_address ON cmc_cxa_key=cxa_key 
     LEFT JOIN co_address ON cxa_adr_key = adr_key 
     WHERE cmc_end_date <= '9/6/2017' AND ind_deceased_flag != 1 AND cmt_code = N'T') t
WHERE t.rnk = 1
SELECT cst_recno as [Member ID],
       cmc_end_date as 'Last Term End date as a Trustee',
       ind_first_name as 'Last Name',
       ind_mid_name as 'First Name',
       ind_last_name as 'Last Name',
       cst_ixo_title_dn as 'title',
       cst_org_name_dn as 'organization',
       adr_country as 'Country',
       adr_city as 'City',
       adr_state as 'State',
       cst_eml_address_dn as 'Email'
  INTO #tempTable
  FROM mb_committee_x_customer  
  JOIN co_customer 
    ON cst_key=cmc_cst_key 
  JOIN mb_committee 
    ON cmt_key=cmc_cmt_key 
  JOIN co_individual 
    ON ind_cst_key=cmc_cst_key 
  LEFT JOIN co_customer_x_address 
    ON cmc_cxa_key=cxa_key 
  LEFT JOIN co_address 
    ON cxa_adr_key = adr_key 
 WHERE cmc_end_date <= '9/6/2017' 
   AND ind_deceased_flag != 1 
   AND cmt_code = N'T'
 ORDER BY cst_recno

;WITH CTE ([Last Term End date as a Trustee], [Last Name])
AS
 (SELECT MAX([Last Term End date as a Trustee]),                
        [Last Name]
   FROM #tempTable
  GROUP BY [Last Name])

SELECT tt.[Member ID],
       c.[Last Term End date as a Trustee],
       c.[Last Name]
  FROM CTE c
  JOIN #tempTable tt
    ON c.[Last Term End date as a Trustee] = tt.[Last Term End date as a Trustee]
   AND c.[Last Name] = tt.[Last Name]