我有一个表格,其中包含问题报告(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。
答案 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;