基于记录间条件的不同SQL选择

时间:2012-10-12 10:18:36

标签: sql oracle date group-by max

我有一个表格,其中包含问题报告(PR)的分配,如下所示:

TABLE "ALLOCATIONS"

ALLOCATIONID    PRID    DATEALLOCATED        ENG_ID
1               401     20-SEP-06 10.48.00   1
2               401     20-SEP-06 10.48.00   2
3               401     20-SEP-06 10.48.00   2
4               402     20-SEP-06 12.35.00   1
5               402     20-SEP-06 12.43.00   1
6               402     20-SEP-06 13.43.00   2
7               700     14-OCT-12 13.30.05   1
8               700     14-OCT-12 13.30.35   2
9               700     14-OCT-12 14.30.35   2

最近的分配确定了PR现在分配给哪个工程师。我想找到分配给工程师2的所有PR。 所以我查找每个PRID的最新分配,检查ENG_ID,如果ENG_ID正确,则从该表中提取信息。

此表包含实际的PR描述(为清楚起见,此处省略了其他信息)。

TABLE "PROBLEMS"

PRID     TITLE
401      Something
402      Something
700      Something

为此,我使用了DATEALLOCATED字段,如下所示:

SELECT PRID, TITLE FROM PROBLEMS p WHERE p.PRID IN
(
    SELECT GROUPEDALLOC.PRID FROM allocations alloc INNER JOIN
    ( 
        SELECT PRID, MAX(DATEALLOCATED) AS MaxAllocationDate    
        FROM allocations   
        GROUP BY PRID
    ) 
    groupedAlloc ON alloc.PRID = groupedAlloc.PRID 
    AND ALLOC.DATEALLOCATED = groupedAlloc.MaxAllocationDate 
    AND ENG_ID = 2
) 
ORDER BY PRID DESC;

现在这适用于上面的记录7,8,9,其中插入了包含秒的长日期格式,但是对于没有记录秒的旧记录,这显然不起作用。对于这些记录,我想回到分配ID(显然可能是顺序也可能不顺序) - 但这是最​​后的手段而且总比没有好。)

我的问题是,如何修改我的查询以在DATEALLOCATED上执行此额外条件(我只想查看它们是否对于特定的PRID都相同),然后使用ALLOCATIONID?

我正在使用OracleXE,但如果可能,我想坚持使用标准SQL。

1 个答案:

答案 0 :(得分:0)

这是否适合你呢?

WITH 
  BY_DATE
  AS (SELECT PRID, MAX (DATEALLOCATED) AS MAXDATE FROM ALLOCATIONS GROUP BY PRID),

  BY_ALLOC
  AS (SELECT A.PRID, MAXDATE, MAX (ALLOCATIONID) AS MAXALLOC
        FROM ALLOCATIONS A JOIN BY_DATE B ON 
             A.PRID = B.PRID AND 
             A.DATEALLOCATED = B.MAXDATE
      GROUP BY A.PRID, MAXDATE)

SELECT A.PRID, A.ENG_ID
  FROM ALLOCATIONS A JOIN BY_ALLOC B ON 
       A.ALLOCATIONID = B.MAXALLOC;