web-dev-qa-db-ja.com

注文ごとに最新の行を選択します

現在、最後に完了した「リソース」が何であるかを示すことにより、特定のアイテムが生産ラインのどこにあるかを確認するために使用されるクエリを作成しています。 (私たちのシステムのリソースは、金属製造、スプレーショップ、電気配線、テストなど、組立ラインのさまざまな領域です。)

未完了のジョブで完了したすべてのリソースを取得するクエリを作成しましたが、各ジョブにはいくつかの完了したリソースがあるため、出力を取得するテーブルをさらに調整する必要があります。

SELECT 
T0."DocNum", 
T2."U_CustomerRef", 
T1."DocNum",
T6."ItemCode", 
CONCAT(T5."firstName", T5."lastName"), 
T4."U_Time",
T4."U_Date",
T4."U_StopTime",
T4."U_StopDate"
FROM 
ORDR T0  INNER JOIN RDR1 T2 ON T0."DocEntry" = T2."DocEntry" 
LEFT OUTER JOIN "NL_LIVE"."OHEM" "OHEM" ON T0."OwnerCode"="OHEM"."empID" 
LEFT OUTER JOIN OWOR T1 ON T1."OriginAbs" = T0."DocEntry" AND T2."ItemCode" =T1."ItemCode" 
INNER JOIN WOR1 T6 ON T1."DocEntry" = T6."DocEntry"
INNER JOIN OITM T3 ON T2."ItemCode" = T3."ItemCode" 
LEFT OUTER JOIN "NL_LIVE"."@OCHLABBOOK" T4 ON T4."U_ProdOrderNo" = T1."DocNum" AND T4."U_ProdOrderLine"=T6."LineNum"
LEFT OUTER JOIN "NL_LIVE"."OHEM" T5 ON T4."U_StartEmp"=T5."U_UniqueID"
WHERE  
T0."DocStatus"='O'
AND T6."ItemType"=290
AND T4."U_Action"<>'Started' AND T4."U_Action"<>'Stopped' AND T4."U_Action"<>'Paused'

日付と時刻を使用して結果に対してSELECTMAXを実行しようとしましたが、各領域にグループ化がないため、テーブルに1つの結果しか残されません。これにより、テーブル全体の最新の結果が得られます。個々の仕事/ドキュメント。この画像では、特定の部分をグループ化する必要があることを示す赤い境界線を描画しています。基本的に必要なのは、クエリ内のデータの小さなグループごとに最新の日付を選択する方法です。各サブセットは、ドキュメント番号でグループ化する必要があります(列1ではなく列3のドキュメント番号)

大きな影付きの赤い領域は、従業員の名前をカバーするためのものであり、質問には関係ありません

Query Results

助けてくれてありがとう。より多くの情報が必要な場合は、テーブル構造などの詳細に入ることができます。

1
KnightLeaf

SELECTのデータモデルがわかりにくいので、以下のサンプルを用意しました

サンプルのHANASQL CTEは、その上で製造される製品を含む生産ラインを選択します。各生産には、生産ラインごとに降順で生産日順に番号を付けています。このために、私は Partition Byを使用したSQLRow_Number関数 句を使用します

rn = 1 WHERE句を使用してCTEデータをフィルタリングした後、各生産ラインの最新の生産を取得します。

LEFT JOINを使用したので、結果セットには製品ライン2が表示されますが、生産はありません。

/*
create column table ProductLines (
 pline int,
 productline varchar(100)
);

create column table ProductLineProduction (
 pline int,
 product varchar(10),
 productdatetime datetime,
 quantity int
);
insert into ProductLines values (1,'LineA');
insert into ProductLines values (2,'LineB');
insert into ProductLines values (3,'LineC');

insert into ProductLineProduction values (3,'Hat','201711011010',100);
insert into ProductLineProduction values (1,'Rug','201711031500',5);
insert into ProductLineProduction values (3,'Shirt','201711051200',200);
insert into ProductLineProduction values (1,'Fabric','201711080830',1000);
insert into ProductLineProduction values (3,'Trouser','201711091600',50);
*/

with cte as (
    select *, 
        row_number() over (partition by pl.pline order by p.productdatetime desc) as rn
    from ProductLines pl
    left outer join ProductLineProduction p
        on pl.pline = p.pline
)
select * from cte where rn = 1;

私のサンプルの出力は次のようになります enter image description here

2
Eralper