0

私が持っているのは2つのテーブルです。テーブル A は次のようになります。

actID; jobnumber; actTypeID; completeDate
1;    2000;       3;      2012-09-04
2;    2000;       4;      2012-09-05
3;    2001;       2;      2012-09-10
4;    2001;       4;      2012-09-05
5;    2001;       5;      2012-09-05
6;    2002;       1;      2012-09-12

テーブル B は次のようになります。

actTypeID;  actType;  projStatus;
1;     Pick;    Build;
2;     Bid;     Estimate;
3;     PMQC;    QC;
4;     Equipment Test;    QC;
5;     Assembly;    Build;

私がする必要があるのは、これにprojStatusandactTypeを含めることです:

SELECT jobnumber,
    max(completedate) completedate
FROM tableA
GROUP BY jobnumber

返されるレコードの数を増やすことなく、つまり、このセットを元に戻します:

jobnumber; actType; projStatus; completedate;
2000;  EquipmentTest; QC;       2012-09-05;
2001;  Bid;           Estimate; 2012-09-10;
2002;  Pick;          Build;    2012-09-12;

私は現在 SQL Server 2005 を使用していますが、間もなく 2008 年になります。このトリックを見逃しているように感じます。

4

3 に答える 3

4

これを試して、

SELECT  x.[jobnumber], x.[actType], x.[projStatus], x.[completeDate]
FROM
(
SELECT a.[actID], a.[jobnumber], b.[actType], b.[projStatus], a.[completeDate],
      ROW_NUMBER() OVER 
     (PARTITiON BY jobnumber ORDER BY [completeDate] DESC ) xx
FROM table1 a
      INNER JOIN table2 b
        on a.[actTypeID]=b.[actTypeID]
) x
WHERE x.xx = 1

SQLFiddle デモ

于 2012-10-19T15:40:26.373 に答える
2

ROW_NUMBER()あなたは機能を探しています

select jobnumber, actType, projStatus, completedate from
(
    select *, 
        ROW_NUMBER() over (partition by jobnumber order by completedate desc) rn 
    from tablea
) v
    left join tableb
        on v.acttypeid = tableb.actTypeID
where rn = 1
于 2012-10-19T15:40:34.527 に答える
0

これを試して:

select a.jobnumber, b.actType, b.projStatus, a.completedate
from 
(select jobnumber, 
       max(actTypeId) as actTypeId,
group by jobnumber) groupTableA
inner join tableA a ON a.jobNumber = groupTableA.jobNumber AND a.actTypeId = groupTableA.actTypeId
inner join tableB b ON b.actTypeId = a.actTypeId
于 2012-10-19T15:51:07.760 に答える