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]