1

我有一个表格,其中包含问题报告 (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 工作正常,但是对于没有记录秒数的旧记录,这显然不起作用。对于这些记录,我想依靠allocationID(显然可能是顺序的,也可能不是顺序的——但这是最后的手段,总比没有好)。

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

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

4

1 回答 1

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;
于 2012-10-12T10:34:58.203 回答