首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Server中不工作的MIN(日期)

在Server中不工作的MIN(日期)
EN

Stack Overflow用户
提问于 2017-12-11 16:01:21
回答 3查看 1.5K关注 0票数 0

我使用SSMS查询Server 2012。我需要与最早的STARTDATE的NPH表的记录。如果我有一个具有相同开始日期的行的客户端,我将得到一行。但是对于具有不同开始日期的行的客户端,我完全没有结果。为什么它不把min(开始日期)从PLACEMENTHISTORY表中带回来?

代码语言:javascript
复制
select distinct lsf.CLIENTNUMBER
,nph.ENDDATE
,nph.STARTDATE
from legalstatusform lsf
left join PLACEMENTHISTORY nph on nph.CLIENTNUMBER = lsf.clientnumber
and (nph.STARTDATE = (select min(startdate) from PLACEMENTHISTORY x
                where x.CLIENTNUMBER = nph.CLIENTNUMBER))
where nph.ENDDATE >= '2017-05-01'
and nph.ENDDATE <= '2017-05-31'
and nph.CLIENTNUMBER = '2001'
group by lsf.CLIENTNUMBER, lsf.ENDDATE, nph.STARTDATE, nph.ENDDATE

这个逻辑没有给我任何结果。

如果我注释出min(startdate)逻辑,我将得到该客户端的3行数据。2017年1月31日、2017年11月4日和2017年10月5日开始。那么,根据min( startdate )逻辑,为什么我没有得到1行与1/31/2017开始日期?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-11 16:08:24

不要使用子查询(并对表进行两次解析),而是尝试使用CTE。这种类型可能最终会变得同样昂贵,取决于您的索引:

代码语言:javascript
复制
WITH CTE AS(
    SELECT lsf.CLIENTNUMBER,
           nph.ENDDATE,
           nph.STARTDATE,
           ROW_NUMBER() OVER (PARTITION BY lsf.CLIENTNUMBER ORDER BY nph.STARTDATE) AS RN
    FROM legalstatusform lsf
    LEFT JOIN PLACEMENTHISTORY nph ON nph.CLIENTNUMBER = lsf.clientnumber
    WHERE nph.ENDDATE >= '2017-05-01'
      AND nph.ENDDATE <= '2017-05-31'
      AND nph.CLIENTNUMBER = '2001'
    GROUP BY lsf.CLIENTNUMBER, lsf.ENDDATE, nph.STARTDATE, nph.ENDDATE)
SELECT *
FROM CTE
WHERE RN = 1;
票数 0
EN

Stack Overflow用户

发布于 2017-12-11 16:06:08

select distinct几乎不适合使用group by

您的问题是where子句中的条件。这些将外部连接转化为内部连接。试试这个:

代码语言:javascript
复制
select distinct lsf.CLIENTNUMBER, nph.ENDDATE, nph.STARTDATE
from legalstatusform lsf left join
     PLACEMENTHISTORY nph
     on nph.CLIENTNUMBER = lsf.clientnumber and
        nph.STARTDATE = (select min(startdate)
                         from PLACEMENTHISTORY x
                         where x.CLIENTNUMBER = nph.CLIENTNUMBER)
                        ) and
        nph.ENDDATE >= '2017-05-01' and
        nph.ENDDATE <= '2017-05-31'
where lsf.CLIENTNUMBER = '2001';

备注:

  • 您可能需要子查询中的ENDDATE条件。
  • 我将窗口函数,而不是这种形式的查询。
  • 如果CLIENTNUMBER是一个数字,那么'2001'不应该有引号。
票数 0
EN

Stack Overflow用户

发布于 2017-12-11 16:06:14

因为带有MIN()的子查询没有这样的条件:

代码语言:javascript
复制
where nph.ENDDATE >= '2017-05-01'
and nph.ENDDATE <= '2017-05-31'

只运行子查询

代码语言:javascript
复制
select min(startdate) from PLACEMENTHISTORY
where x.CLIENTNUMBER = '2001'

并查看带有MIN() startdate的行是否与外部查询中的筛选器匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47756727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档