5

私は今朝、これに頭を悩ませようとしています。

パーツ (当社製品) のステータスを表示しようとしていinventoryますが、すべてのパーツを返品しようとすると、このクエリは複雑になります。

私はそれをレイアウトしましょう:

  • シングルテーブルinventoryReport
  • 表示したい X 個の部品の明確なリストがあり、その結果は X 行 (最新の在庫エントリを示す部品ごとに 1 行) になる必要があります。
  • テーブルは、在庫変更の日付エントリで構成されています (したがって、LATEST部品ごとの日付エントリのみが必要です)。
  • すべてのデータがこの単一のテーブルに含まれているため、結合は必要ありません。

現在、単一のパーツの場合、それはかなり単純であり、次の sql を実行することでこれを達成できます (いくつかのアイデアを提供するため):

SELECT     TOP (1) ldDate, ptProdLine, inPart, inSite, inAbc, ptUm, inQtyOh + inQtyNonet AS in_qty_oh, inQtyAvail, inQtyNonet, ldCustConsignQty, inSuppConsignQty
FROM         inventoryReport
WHERE     (ldPart = 'ABC123')
ORDER BY ldDate DESC

これにより、TOP 1 行が取得されます。パーツごとに非常に単純ですが、すべての X (30 パーツとしましょう) を表示する必要があります。したがって、その結果には30行が必要です。もちろん、簡単な解決策は、私のコードで SQL 呼び出しの X# をループすることです (ただし、コストがかかります)。それで十分ですが、この目的のために、この SQL をもう少し処理して、db への x# 呼び出しを減らしたいと思います。 (不要な場合) クエリを 1 つだけに減らします。

ここでわかることから、結果セットを探している間、アイテムごとの最新の日付を追跡する必要があります。

私は最終的に

WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc)

必要なパーツを限定するためです。うまくいけば、私は私の質問を十分に明確にしました。アイデアがあれば教えてください。DISTINCT行が同じではなく、日付が最新である必要があり、最大 X 行が必要なため、 実行できません。

考え?私は立ち往生しています...

4

3 に答える 3

5
  SELECT *
  FROM   (SELECT i.*,
      ROW_NUMBER() OVER(PARTITION BY ldPart ORDER BY ldDate DESC) r
      FROM   inventoryReport i
      WHERE  ldPart in ('ABC123', 'BFD21', 'AA123', etc)
         )
  WHERE  r = 1
于 2010-09-09T14:16:52.137 に答える
2

サブクエリに参加する必要があります。

SELECT i.ldPart, x.LastDate, i.inAbc
FROM inventoryReport i
INNER JOIN (Select ldPart, Max(ldDate) As LastDate FROM inventoryReport GROUP BY ldPart) x
on i.ldPart = x.ldPart and i.ldDate = x.LastDate
于 2010-09-09T14:17:09.483 に答える
2

編集:各ソリューションのパフォーマンスを必ずテストしてください。この質問で指摘されているように、CTEメソッドはROW_NUMBERを使用した場合よりもパフォーマンスが優れている可能性があります。

;with cteMaxDate as (
    select ldPart, max(ldDate) as MaxDate
        from inventoryReport
        group by ldPart
)
SELECT md.MaxDate, ir.ptProdLine, ir.inPart, ir.inSite, ir.inAbc, ir.ptUm, ir.inQtyOh + ir.inQtyNonet AS in_qty_oh, ir.inQtyAvail, ir.inQtyNonet, ir.ldCustConsignQty, ir.inSuppConsignQty
    FROM cteMaxDate md
        INNER JOIN inventoryReport ir
            on md.ldPart = ir.ldPart
                and md.MaxDate = ir.ldDate
于 2010-09-09T14:18:33.523 に答える