首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle -如何在不使用组的情况下过滤重复行

Oracle -如何在不使用组的情况下过滤重复行
EN

Stack Overflow用户
提问于 2012-07-25 22:04:23
回答 3查看 6.4K关注 0票数 0

我有以下查询:

代码语言:javascript
复制
select
   C.PROJECTID, C.VERSIONID, C.MODIFIEDATTRIBUTEID, C.MODIFIEDDATE, V.NAME
from TPM_PROJECTCHANGES C
inner join TPM_PROJECTVERSION V ON C.PROJECTID = V.PROJECTID AND C.VERSIONID = V.VERSIONID
where C.MODIFIEDDATE BETWEEN TO_DATE('07/18/12', 'MM/DD/YY') and TO_DATE('07/25/12', 'MM/DD/YY')

我想在特定日期之间显示项目中的所有更改。这个很好用。但是,我有很多重复的属性(比如有人在同一个项目中更改了50次相同的属性)。我想过滤掉这些内容,并且只显示在项目中更改某个属性的最近一次。我可以这样做:

代码语言:javascript
复制
select
   C.PROJECTID, C.VERSIONID, C.MODIFIEDATTRIBUTEID, MAX(C.MODIFIEDDATE)
from TPM_PROJECTCHANGES C
having MAX(C.MODIFIEDDATE) BETWEEN TO_DATE('07/18/12', 'MM/DD/YY') and TO_DATE('07/25/12', 'MM/DD/YY')
group by C.PROJECTID, C.VERSIONID, C.MODIFIEDATTRIBUTEID

然而,现在我不能JOIN任何东西。例如,如果我尝试:

代码语言:javascript
复制
select
   C.PROJECTID, C.VERSIONID, C.MODIFIEDATTRIBUTEID, MAX(C.MODIFIEDDATE), V.NAME
from TPM_PROJECTCHANGES C
inner join TPM_PROJECTVERSION V ON C.PROJECTID = V.PROJECTID AND C.VERSIONID = V.VERSIONID
having MAX(C.MODIFIEDDATE) BETWEEN TO_DATE('07/18/12', 'MM/DD/YY') and TO_DATE('07/25/12', 'MM/DD/YY')
group by C.PROJECTID, C.VERSIONID, C.MODIFIEDATTRIBUTEID

我会得到错误:

ORA-00979:不是按表达式分组

是否有更好的方法筛选出对同一项目的重复更改?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-25 22:15:33

您还可以使用分析函数:

代码语言:javascript
复制
select PROJECTID, VERSIONID, MODIFIEDATTRIBUTEID, MODIFIEDDATE, Name
from (select C.PROJECTID, C.VERSIONID, C.MODIFIEDATTRIBUTEID, C.MODIFIEDDATE, V.NAME,
             row_number() over (partition by C.PROJECTID, C.VERSIONID, C.MODIFIEDATTRIBUTEID, V.NAME
                                order by C.MODIFIEDDATE desc) as seqnum
      from TPM_PROJECTCHANGES C inner join
           TPM_PROJECTVERSION V ON C.PROJECTID = V.PROJECTID AND C.VERSIONID = V.VERSIONID
      where C.MODIFIEDDATE BETWEEN TO_DATE('07/18/12', 'MM/DD/YY') and
                                   TO_DATE('07/25/12', 'MM/DD/YY')
     ) t
where seqnum = 1
票数 2
EN

Stack Overflow用户

发布于 2012-07-25 22:08:13

HAVING应该是查询的最后一行:

代码语言:javascript
复制
select
   C.PROJECTID, C.VERSIONID, C.MODIFIEDATTRIBUTEID, MAX(C.MODIFIEDDATE), V.NAME
from TPM_PROJECTCHANGES C
inner join TPM_PROJECTVERSION V 
ON C.PROJECTID = V.PROJECTID AND C.VERSIONID = V.VERSIONID
group by C.PROJECTID, C.VERSIONID, C.MODIFIEDATTRIBUTEID, V.NAME
having MAX(C.MODIFIEDDATE) BETWEEN TO_DATE('07/18/12', 'MM/DD/YY') and TO_DATE('07/25/12', 'MM/DD/YY')
票数 1
EN

Stack Overflow用户

发布于 2012-07-25 22:17:14

SQL查询组合的基本规则如下。将工作的SQl查询封装在括号中,并将其内联为视图:

代码语言:javascript
复制
select
   V.NAME, IC.* 
from (/*working query against TPM_PROJECTCHANGES here*/ ) IC
inner join TPM_PROJECTVERSION V ...

关于上一个查询的语法,预计逐组列表将容纳比select子句更多的列,而不是更少(当然不包括聚合)。

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

https://stackoverflow.com/questions/11659340

复制
相关文章

相似问题

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