1

ここでは話があります:私は有害な液体化学物質を有用な化学物質にリサイクルする会社で働いています。このプロセスの一部は、リサイクルプロセスの各部分が完了したときに、これらの材料を1つのタンクから別のタンクに移動することを含む。これらのタンクは、私たちのタンクファーム、蒸留システムの一部、鉄道車両、またはタンカートラックのいずれかにあります。私が割り当てられたタスクは、マネージャが任意のタンクを持ち上げて、それが処分されるかまたは売り出されるまで各タンクを通してその材料の動きに従うことを可能にするクエリを書くことでした。私の時間の前に、データベースは約10年前に構築されていたので、データは私が処理しなければならないものです(つまり、作業を簡単にするために変更することはできません)。今再帰的なT-SQLクエリ日付とタンク名を使用

テーブル構造:この努力に自分自身を貸すの列は以下のとおりです。

  • SouceTank
  • OpenDate(日空のタンクは材料の受信を開始する)
  • CosedDate(タンクがある日付
  • DestinationTank(材料が移されたタンク)
  • ProductName(私は動きを検証するためにこれを追加します。混合する。いくつかあります。アルゴリズムが正しく動作していないと、問題が発生する可能性があります。

すべてのタンクにはOpenDateがありますが、タンクがまだ満杯になっているか、出荷待ちのタンクには終了日がありません。ほとんどの場合、タンクは化学的に異論はありません。空のタンクはどんな化学物質にも使用できます。 1から10までの動きが期待できます。

再帰的なCTE T-SQLアルゴリズムを使用しましたが、SourceTankのCosedDateがDestinationTankのOpenDateとCosedDateの間にあった一致するDestinationTankにSourceTankを一致させようとしましたが、まだ閉じていなければ、DestinationTankのOpenDate。

サンプルデータ:

SourceTank StartDate ClosedDate DestinationTank ProductName 
------------------------------------------------------------------------ 
TNK01-5  08/03/2017 08/10/2017 TNK30-6   Fuels 
TNK01-5  08/07/2017 08/10/2017 TNK40-6   Fuels 
TNK01-5  07/20/2017 07/31/2017 TNK01-5   Incin 
TNK01-5  08/10/2017 08/17/2017 TNK30-6   Incin 
TNK01-5  08/12/2017 08/17/2017 TNK30-6   Fuels 
TNK03-5  08/13/2017 08/22/2017 TNK30-6   IBAC feed 
TNK07-5  08/11/2017 08/17/2017 TNK40-6   Incin 
TNK07-5  08/14/2017 08/29/2017 TNK40-6   Fuels 
TNK07-5  07/15/2017 08/10/2017 TNK30-6   Picoline Cut 
TNK07-5  08/03/2017 08/10/2017 TNK02-5   Pico 2nd Pass 
TNK07-5  08/06/2017 08/17/2017 TNK40-6   Fuels 
TNK08-5  08/05/2017 08/10/2017 TNK40-6   Fuels 
TNK08-5  08/07/2017 08/08/2017 TNK30-6   Fuels 
TNK08-5  08/10/2017 08/22/2017 TNK40-6   Water 
TNK08-5  07/24/2017 08/10/2017 TNK02-5   Picoline Cut 
TNK09-10 07/20/2017 NULL   TNK30-6   Picoline Crude 
TNK09-10 07/21/2017 08/04/2017 TNK30-6   Picoline Crude 
TNK09-10 08/02/2017 08/10/2017 TNK30-6   Cyclo Waste 
TNK09-10 08/05/2017 08/10/2017 TNK30-6   Cyclo Waste 
TNK09-10 08/07/2017 08/10/2017 TNK30-6   Cyclo Waste 
TNK09-10 08/04/2017 08/10/2017 TNK30-6   Cyclo Waste 
TNK09-10 08/15/2017 08/22/2017 TNK30-6   IBAC feed 
TNK09-10 08/11/2017 08/17/2017 TNK30-6   IBAC feed 
TNK09-10 08/12/2017 08/17/2017 TNK30-6   IBAC feed 
TNK30-6  08/08/2017 08/29/2017 TNK30-6   Cyclo Waste 
TNK40-6  08/13/2017 08/22/2017 TNK30-6   IBAC:PRODUCT 
TNK41-6  08/14/2017 09/27/2017 NATX25496   IBAC:PRODUCT 
TNK51-12 07/26/2017 09/15/2017 TNK30-6   CYCLO Product 
TNK62-12 07/28/2017 09/12/2017 TNK30-6   NON-RCRA NMP 
TNK74-12 07/29/2017 NULL   TNK30-6   Picoline Crude 
TNK91-8  08/03/2017 08/22/2017 TNK08-5   Picoline Prod 

ここに私が試したものです。私は私が期待した結果がどのように見えるか分からないとして、これはどのように便利になりますわからない

WITH TanksCTE AS (
SELECT [TrackingNum] 
     ,[TblTankTracking].[TankID] 
     ,[StartDate] 
     ,[TblTankTracking].[ProductID] 
     ,[ClosedDate] 
     ,[Destination] 
    FROM [MAFTS].[Laboratory].[TblTankTracking] 

UNION ALL 

SELECT TCTE.[TrackingNum] 
     ,TRACK.[TankID] 
     ,TRACK.[StartDate] 
     ,TRACK.[ProductID] 
     ,TRACK.[ClosedDate] 
     ,TRACK.[Destination] 
    FROM TanksCTE AS TCTE INNER JOIN 
     [MAFTS].[Laboratory].[TblTankTracking] TRACK 
     ON TCTE.[TankID] = TRACK.[Destination] 
     AND TRACK.[ClosedDate] BETWEEN TCTE.[StartDate] AND TCTE.[ClosedDate] 
) 

SELECT * FROM TanksCTE 
    option (maxrecursion 0) 
+0

入力パラメータがある場合は、それを私たちに教えてください。あなたはタンクベースでタンク上でこのクエリを行うつもりですか?)含まれていると便利かもしれないクエリが動作していない場合。 – pcdev

+0

質問を改善するためのヒントについては、[こちら](http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/)をお読みください。適切なソフトウェア(MySQL、Oracle、DB2など)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-2014'です。構文と機能の相違は、しばしば答えに影響します。 'tsql'は選択肢を絞り込みますが、データベースは指定しないことに注意してください。 – HABO

+0

正しい結果は何ですか?あらゆる種類のクエリを生成することができますが、提供されたデータの結果として期待していることがわかっているのが最善です。 *私たちが提案するクエリを検証することもできますので、あなたの仕事は少なくなります。* –

答えて

1

.. NULL ClosingDateを処理する方法を知りませんでしたが、それは助けるかもしれません。私は日付の意味を理解しようとしていたので、それらをパス列に連結しているのが見えます。私はまたどこから始めるべきかわからなかったので、各タンクの最も早い開始日を推測しました。

SQL Fiddle

MS SQL Serverの2014スキーマのセットアップ:1

CREATE TABLE Table1 
    ([SourceTank] varchar(8), [StartDate] datetime, [ClosedDate] datetime, [DestinationTank] varchar(9), [ProductName] varchar(14)) 
; 

INSERT INTO Table1 
    ([SourceTank], [StartDate], [ClosedDate], [DestinationTank], [ProductName]) 
VALUES 
    ('TNK01-5', '2017-08-03 00:00:00', '08/10/2017', 'TNK30-6', 'Fuels'), 
    ('TNK01-5', '2017-08-07 00:00:00', '08/10/2017', 'TNK40-6', 'Fuels'), 
    ('TNK01-5', '2017-07-20 00:00:00', '07/31/2017', 'TNK01-5', 'Incin'), 
    ('TNK01-5', '2017-08-10 00:00:00', '08/17/2017', 'TNK30-6', 'Incin'), 
    ('TNK01-5', '2017-08-12 00:00:00', '08/17/2017', 'TNK30-6', 'Fuels'), 
    ('TNK03-5', '2017-08-13 00:00:00', '08/22/2017', 'TNK30-6', 'IBAC feed'), 
    ('TNK07-5', '2017-08-11 00:00:00', '08/17/2017', 'TNK40-6', 'Incin'), 
    ('TNK07-5', '2017-08-14 00:00:00', '08/29/2017', 'TNK40-6', 'Fuels'), 
    ('TNK07-5', '2017-07-15 00:00:00', '08/10/2017', 'TNK30-6', 'Picoline Cut'), 
    ('TNK07-5', '2017-08-03 00:00:00', '08/10/2017', 'TNK02-5', 'Pico 2nd Pass'), 
    ('TNK07-5', '2017-08-06 00:00:00', '08/17/2017', 'TNK40-6', 'Fuels'), 
    ('TNK08-5', '2017-08-05 00:00:00', '08/10/2017', 'TNK40-6', 'Fuels'), 
    ('TNK08-5', '2017-08-07 00:00:00', '08/08/2017', 'TNK30-6', 'Fuels'), 
    ('TNK08-5', '2017-08-10 00:00:00', '08/22/2017', 'TNK40-6', 'Water'), 
    ('TNK08-5', '2017-07-24 00:00:00', '08/10/2017', 'TNK02-5', 'Picoline Cut'), 
    ('TNK09-10', '2017-07-20 00:00:00', NULL, 'TNK30-6', 'Picoline Crude'), 
    ('TNK09-10', '2017-07-21 00:00:00', '08/04/2017', 'TNK30-6', 'Picoline Crude'), 
    ('TNK09-10', '2017-08-02 00:00:00', '08/10/2017', 'TNK30-6', 'Cyclo Waste'), 
    ('TNK09-10', '2017-08-05 00:00:00', '08/10/2017', 'TNK30-6', 'Cyclo Waste'), 
    ('TNK09-10', '2017-08-07 00:00:00', '08/10/2017', 'TNK30-6', 'Cyclo Waste'), 
    ('TNK09-10', '2017-08-04 00:00:00', '08/10/2017', 'TNK30-6', 'Cyclo Waste'), 
    ('TNK09-10', '2017-08-15 00:00:00', '08/22/2017', 'TNK30-6', 'IBAC feed'), 
    ('TNK09-10', '2017-08-11 00:00:00', '08/17/2017', 'TNK30-6', 'IBAC feed'), 
    ('TNK09-10', '2017-08-12 00:00:00', '08/17/2017', 'TNK30-6', 'IBAC feed'), 
    ('TNK30-6', '2017-08-08 00:00:00', '08/29/2017', 'TNK30-6', 'Cyclo Waste'), 
    ('TNK40-6', '2017-08-13 00:00:00', '08/22/2017', 'TNK30-6', 'IBAC:PRODUCT'), 
    ('TNK41-6', '2017-08-14 00:00:00', '09/27/2017', 'NATX25496', 'IBAC:PRODUCT'), 
    ('TNK51-12', '2017-07-26 00:00:00', '09/15/2017', 'TNK30-6', 'CYCLO Product'), 
    ('TNK62-12', '2017-07-28 00:00:00', '09/12/2017', 'TNK30-6', 'NON-RCRA NMP'), 
    ('TNK74-12', '2017-07-29 00:00:00', NULL, 'TNK30-6', 'Picoline Crude'), 
    ('TNK91-8', '2017-08-03 00:00:00', '08/22/2017', 'TNK08-5', 'Picoline Prod') 
; 

問合せ:

with TankStart as (
    select 
      * 
     , row_number() over(partition by SourceTank order by StartDate ASC) as rn 
    from Table1 
    ) 
, TankPaths as (
     SELECT 
      T.SourceTank 
      , T.DestinationTank 
      , T.StartDate 
      , T.ClosedDate 
      , T.ProductName 
      , CAST(T.DestinationTank AS varchar(max)) 
      + ' ' 
      + convert(varchar(10),T.ClosedDate,120) 
      AS Pathway 
     FROM TankStart T 
     WHERE T.rn = 1 
     union all 
     SELECT 
      T1.SourceTank 
      , T1.DestinationTank 
      , T1.StartDate 
      , T1.ClosedDate 
      , T1.ProductName 
      , M.Pathway 
      + ' ' 
      + convert(varchar(10),T1.StartDate,120) 
      + ', ' 
      + CAST(T1.DestinationTank AS varchar(max)) 
      + ', ' 
      + convert(varchar(10),T1.ClosedDate,120) 

     FROM Table1 T1 
     INNER JOIN TankPaths M ON M.DestinationTank = T1.SourceTank 
         AND M.ClosedDate <= T1.StartDate 
     where T1.SourceTank <> T1.DestinationTank 
    ) 
select * 
from TankPaths 
order by 1, 2, Pathway 

Results

| SourceTank | DestinationTank |   StartDate |   ClosedDate | ProductName |                   Pathway | 
|------------|-----------------|----------------------|----------------------|----------------|------------------------------------------------------------------------------------| 
| TNK01-5 |   TNK01-5 | 2017-07-20T00:00:00Z | 2017-07-31T00:00:00Z |   Incin |                 TNK01-5 2017-07-31 | 
| TNK01-5 |   TNK30-6 | 2017-08-03T00:00:00Z | 2017-08-10T00:00:00Z |   Fuels |         TNK01-5 2017-07-31 2017-08-03, TNK30-6, 2017-08-10 | 
| TNK01-5 |   TNK30-6 | 2017-08-10T00:00:00Z | 2017-08-17T00:00:00Z |   Incin |         TNK01-5 2017-07-31 2017-08-10, TNK30-6, 2017-08-17 | 
| TNK01-5 |   TNK30-6 | 2017-08-12T00:00:00Z | 2017-08-17T00:00:00Z |   Fuels |         TNK01-5 2017-07-31 2017-08-12, TNK30-6, 2017-08-17 | 
| TNK01-5 |   TNK40-6 | 2017-08-07T00:00:00Z | 2017-08-10T00:00:00Z |   Fuels |         TNK01-5 2017-07-31 2017-08-07, TNK40-6, 2017-08-10 | 
| TNK03-5 |   TNK30-6 | 2017-08-13T00:00:00Z | 2017-08-22T00:00:00Z |  IBAC feed |                 TNK30-6 2017-08-22 | 
| TNK07-5 |   TNK30-6 | 2017-07-15T00:00:00Z | 2017-08-10T00:00:00Z | Picoline Cut |                 TNK30-6 2017-08-10 | 
| TNK08-5 |   TNK02-5 | 2017-07-24T00:00:00Z | 2017-08-10T00:00:00Z | Picoline Cut |                 TNK02-5 2017-08-10 | 
| TNK09-10 |   TNK30-6 | 2017-07-20T00:00:00Z |    (null) | Picoline Crude |                    (null) | 
| TNK30-6 |   TNK30-6 | 2017-08-08T00:00:00Z | 2017-08-29T00:00:00Z | Cyclo Waste |                 TNK30-6 2017-08-29 | 
| TNK40-6 |   TNK30-6 | 2017-08-13T00:00:00Z | 2017-08-22T00:00:00Z | IBAC:PRODUCT | TNK01-5 2017-07-31 2017-08-07, TNK40-6, 2017-08-10 2017-08-13, TNK30-6, 2017-08-22 | 
| TNK40-6 |   TNK30-6 | 2017-08-13T00:00:00Z | 2017-08-22T00:00:00Z | IBAC:PRODUCT |                 TNK30-6 2017-08-22 | 
| TNK41-6 |  NATX25496 | 2017-08-14T00:00:00Z | 2017-09-27T00:00:00Z | IBAC:PRODUCT |                NATX25496 2017-09-27 | 
| TNK51-12 |   TNK30-6 | 2017-07-26T00:00:00Z | 2017-09-15T00:00:00Z | CYCLO Product |                 TNK30-6 2017-09-15 | 
| TNK62-12 |   TNK30-6 | 2017-07-28T00:00:00Z | 2017-09-12T00:00:00Z | NON-RCRA NMP |                 TNK30-6 2017-09-12 | 
| TNK74-12 |   TNK30-6 | 2017-07-29T00:00:00Z |    (null) | Picoline Crude |                    (null) | 
| TNK91-8 |   TNK08-5 | 2017-08-03T00:00:00Z | 2017-08-22T00:00:00Z | Picoline Prod |                 TNK08-5 2017-08-22 | 
+0

私はこの解決策が好きです。私はそれが私たちのために仕事をするかどうかを確認するために少し勉強する必要があります。 –

+0

ユーザーは、どのタンクでも、プロセスのどの段階でも起動できます。それで、彼/彼女はちょうどその場所から材料がどこに行ったかを見つけるためにいくつかの場所の真ん中でピックアップするかもしれません。 –

+0

今後の訪問者が知っているように、私はこのフレームワークを利用して@Used_By_既に親切に提供しており、各転送に関連する情報を追加することで、私たちの管理にとってより使いやすくなります。ありがとうUsed_By_既に! –