首页 > 解决方案 > GROUP BY、ORDER BY 并在 LINQ 中排名第一

问题描述

假设我有一个包含两列的表:

TABLE A
-------
ProjectID           NUMBER
STATUS              VARCHAR2(6) // either 'CLOSED' or 'NEW'

a 最多可以有两个条目,其中ProjectID有两个可能的值,STATUS并且组合 ( ProjectID, STATUS) 是唯一的。

我只需要选择ProjectID状态为“新”的那些。此外,如果对于 a projectID,有两个具有不同状态的条目(NEW 和 CLOSED),我不希望它出现在输出中。

我尝试使用 group by,然后对结果集进行降序排序(以便首先获取项目 ID 的“新”行),然后在 LINQ 中获取第一行,类似于以下内容:

   var query = (from a in context.A.Where(o => o.STATUS == 'NEW')
               group a by a.ProjectID into groups
               select groups.OrderByDescending(o => o.ProjectID)
               .ThenBy(o => o.STATUS)
               .FirstOrDefault()); 

但这会导致查询中出现“APPLY” clouse,从而导致错误。显然,Oracle 10g 不支持它。

任何帮助表示赞赏。

标签: c#sqloraclelinqoracle10g

解决方案


正确使用having count(distinct STATUS=1)

create table tableA( ProjectID int, STATUS varchar2(10) );
insert all
  into tableA values(1    ,'NEW')
  into tableA values(1    ,'CHANGED')
  into tableA values(2    ,'NEW')
  into tableA values(3    ,'CHANGED')
select * from dual; 
/
select * from
(
select ProjectID, max(STATUS) STATUS
  from tableA
 group by ProjectID
having count(distinct STATUS)=1
)
where STATUS = 'NEW';

推荐阅读