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が正しい場合はこのテーブルから情報を引き出します。

この表には、実際のP​​Rの説明(およびわかりやすくするためにここでは省略されているその他の情報)が含まれています。

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 に答える