2017-08-28 4 views
0

私は、すべての更新を別のテーブルに保持するために使用されるSQLテーブルを持っています。他のテーブルの何かが更新されるたびに、このShadowテーブルは更新前のすべてのデータで新しい行を取得します。SQLに初めて日付を入力する方法は?

+--------------------------------+-------------------------+-------------------------+--------------------------+ 
| cd_POLineItemScheduledShipDate |  CreatedOn  |  UpdatedOn  | _rescd_PurchaseOrderLine | 
+--------------------------------+-------------------------+-------------------------+--------------------------+ 
| 2017-08-18 00:00:00.000  | 2017-08-15 11:14:00.623 | 2017-08-24 14:49:45.850 | 037-01714223-REF-1  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:31.553 | 2017-08-24 14:48:52.287 | 037-01714223-REF-1  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:44.007 | 2017-08-24 14:48:45.927 | 037-01714223-REF-1  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:28.833 | 2017-08-24 14:48:39.287 | 037-01714223-REF-1  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:48.490 | 2017-08-24 14:48:32.847 | 037-01714223-REF-1  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:39.410 | 2017-08-24 14:48:26.253 | 037-01714223-REF-1  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:44.007 | 2017-08-24 14:47:56.753 | 037-01714223-REF-1  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:28.833 | 2017-08-24 14:47:56.723 | 037-01714223-REF-1  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:48.490 | 2017-08-24 14:47:56.660 | 037-01714223-REF-1  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:31.553 | 2017-08-24 14:47:56.630 | 037-01714223-REF-1  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:39.410 | 2017-08-24 14:47:56.567 | 037-01714223-REF-1  | 
| NULL       | 2017-08-15 11:14:00.623 | 2017-08-15 14:03:15.067 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:36.537 | 2017-08-14 12:45:13.103 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:45.363 | 2017-08-14 12:45:05.057 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:44.007 | 2017-08-14 12:44:58.027 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:28.833 | 2017-08-14 12:44:50.620 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:48.490 | 2017-08-14 12:44:43.387 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:31.553 | 2017-08-14 12:44:36.353 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:39.410 | 2017-08-14 12:44:28.450 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:40.113 | 2017-08-14 12:44:21.230 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:45.990 | 2017-08-14 12:44:13.730 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:41.240 | 2017-08-14 12:44:06.823 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:41.457 | 2017-08-14 12:43:59.370 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:37.553 | 2017-08-14 12:43:51.730 | 037-01714223-REF-1  | 
| NULL       | 2017-08-11 11:13:40.707 | 2017-08-14 12:43:44.527 | 037-01714223-REF-1  | 
| 2017-08-18 00:00:00.000  | 2017-08-15 11:14:00.623 | 2017-08-24 14:49:45.850 | 037-01714223-REF-2  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:31.553 | 2017-08-24 14:48:52.287 | 037-01714223-REF-2  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:44.007 | 2017-08-24 14:48:45.927 | 037-01714223-REF-2  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:28.833 | 2017-08-24 14:48:39.287 | 037-01714223-REF-2  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:48.490 | 2017-08-24 14:48:32.847 | 037-01714223-REF-2  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:39.410 | 2017-08-24 14:48:26.253 | 037-01714223-REF-2  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:44.007 | 2017-08-24 14:47:56.753 | 037-01714223-REF-2  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:28.833 | 2017-08-24 14:47:56.723 | 037-01714223-REF-2  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:48.490 | 2017-08-24 14:47:56.660 | 037-01714223-REF-2  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:31.553 | 2017-08-24 14:47:56.630 | 037-01714223-REF-2  | 
| 2017-08-18 00:00:00.000  | 2017-08-11 11:13:39.410 | 2017-08-24 14:47:56.567 | 037-01714223-REF-2  | 
| NULL       | 2017-08-15 11:14:00.623 | 2017-08-15 14:03:15.067 | 037-01714223-REF-2  | 
| NULL       | 2017-08-11 11:13:36.537 | 2017-08-14 12:45:13.103 | 037-01714223-REF-2  | 
| NULL       | 2017-08-11 11:13:45.363 | 2017-08-14 12:45:05.057 | 037-01714223-REF-2  | 
| NULL       | 2017-08-11 11:13:44.007 | 2017-08-14 12:44:58.027 | 037-01714223-REF-2  | 
| NULL       | 2017-08-11 11:13:28.833 | 2017-08-14 12:44:50.620 | 037-01714223-REF-2  | 
| NULL       | 2017-08-11 11:13:48.490 | 2017-08-14 12:44:43.387 | 037-01714223-REF-2  | 
| NULL       | 2017-08-11 11:13:31.553 | 2017-08-14 12:44:36.353 | 037-01714223-REF-2  | 
| NULL       | 2017-08-11 11:13:39.410 | 2017-08-14 12:44:28.450 | 037-01714223-REF-2  | 
+--------------------------------+-------------------------+-------------------------+--------------------------+ 

したがって、2つの異なる_rescd_PurchaseOrderLine番号があります。それぞれには、cd_POLineItemScheduledShipDateの場合はNULL、次にヌルでないいくつかの行があります。 (これはUpdatedOn descでソートされている)

私は、各発注ラインのためUpdatedOn descが注文したときcd_POLineItemScheduledShipDateの最初のインスタンスがNULLされていないとの行からUpdatedOn日付を取得しようとしています。だから私は結果があることを期待するの下に例えば:

+-------------------------+--------------------------+ 
|  UpdatedOn  | _rescd_PurchaseOrderLine | 
+-------------------------+--------------------------+ 
| 2017-08-24 14:47:56.567 | 037-01714223-REF-1  | 
| 2017-08-24 14:47:56.567 | 037-01714223-REF-2  | 
+-------------------------+--------------------------+ 

私はjoinsgroupsmaxを使用したりminといくつかのことを試してみたが、私はちょうどそれが届きません。

誰かが正しい方向に私を指すことができたら、私はそれを感謝します!

答えて

1

これは、あなたが

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData; 

CREATE TABLE #TestData (
    RN INT NOT NULL IDENTITY(1,1), -- Need something to sort on that will hold the insert order... 
    cd_POLineItemScheduledShipDate DATETIME NULL, 
    CreatedOn DATETIME NOT NULL, 
    UpdatedOn DATETIME NOT NULL, 
    rescd_PurchaseOrderLine VARCHAR(20) NOT NULL 
    ); 
INSERT #TestData (cd_POLineItemScheduledShipDate, CreatedOn, UpdatedOn, rescd_PurchaseOrderLine) VALUES 
    ('2017-08-18 00:00:00.000', '2017-08-15 11:14:00.623', '2017-08-24 14:49:45.850', '037-01714223-REF-1'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:31.553', '2017-08-24 14:48:52.287', '037-01714223-REF-1'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:44.007', '2017-08-24 14:48:45.927', '037-01714223-REF-1'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:28.833', '2017-08-24 14:48:39.287', '037-01714223-REF-1'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:48.490', '2017-08-24 14:48:32.847', '037-01714223-REF-1'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:39.410', '2017-08-24 14:48:26.253', '037-01714223-REF-1'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:44.007', '2017-08-24 14:47:56.753', '037-01714223-REF-1'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:28.833', '2017-08-24 14:47:56.723', '037-01714223-REF-1'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:48.490', '2017-08-24 14:47:56.660', '037-01714223-REF-1'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:31.553', '2017-08-24 14:47:56.630', '037-01714223-REF-1'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:39.410', '2017-08-24 14:47:56.567', '037-01714223-REF-1'), 
    (NULL, '2017-08-15 11:14:00.623', '2017-08-15 14:03:15.067', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:36.537', '2017-08-14 12:45:13.103', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:45.363', '2017-08-14 12:45:05.057', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:44.007', '2017-08-14 12:44:58.027', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:28.833', '2017-08-14 12:44:50.620', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:48.490', '2017-08-14 12:44:43.387', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:31.553', '2017-08-14 12:44:36.353', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:39.410', '2017-08-14 12:44:28.450', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:40.113', '2017-08-14 12:44:21.230', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:45.990', '2017-08-14 12:44:13.730', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:41.240', '2017-08-14 12:44:06.823', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:41.457', '2017-08-14 12:43:59.370', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:37.553', '2017-08-14 12:43:51.730', '037-01714223-REF-1'), 
    (NULL, '2017-08-11 11:13:40.707', '2017-08-14 12:43:44.527', '037-01714223-REF-1'), 
    ('2017-08-18 00:00:00.000', '2017-08-15 11:14:00.623', '2017-08-24 14:49:45.850', '037-01714223-REF-2'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:31.553', '2017-08-24 14:48:52.287', '037-01714223-REF-2'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:44.007', '2017-08-24 14:48:45.927', '037-01714223-REF-2'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:28.833', '2017-08-24 14:48:39.287', '037-01714223-REF-2'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:48.490', '2017-08-24 14:48:32.847', '037-01714223-REF-2'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:39.410', '2017-08-24 14:48:26.253', '037-01714223-REF-2'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:44.007', '2017-08-24 14:47:56.753', '037-01714223-REF-2'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:28.833', '2017-08-24 14:47:56.723', '037-01714223-REF-2'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:48.490', '2017-08-24 14:47:56.660', '037-01714223-REF-2'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:31.553', '2017-08-24 14:47:56.630', '037-01714223-REF-2'), 
    ('2017-08-18 00:00:00.000', '2017-08-11 11:13:39.410', '2017-08-24 14:47:56.567', '037-01714223-REF-2'), 
    (NULL, '2017-08-15 11:14:00.623', '2017-08-15 14:03:15.067', '037-01714223-REF-2'), 
    (NULL, '2017-08-11 11:13:36.537', '2017-08-14 12:45:13.103', '037-01714223-REF-2'), 
    (NULL, '2017-08-11 11:13:45.363', '2017-08-14 12:45:05.057', '037-01714223-REF-2'), 
    (NULL, '2017-08-11 11:13:44.007', '2017-08-14 12:44:58.027', '037-01714223-REF-2'), 
    (NULL, '2017-08-11 11:13:28.833', '2017-08-14 12:44:50.620', '037-01714223-REF-2'), 
    (NULL, '2017-08-11 11:13:48.490', '2017-08-14 12:44:43.387', '037-01714223-REF-2'), 
    (NULL, '2017-08-11 11:13:31.553', '2017-08-14 12:44:36.353', '037-01714223-REF-2'), 
    (NULL, '2017-08-11 11:13:39.410', '2017-08-14 12:44:28.450', '037-01714223-REF-2'); 

-- SELECT * FROM #TestData td; 

--============================================================================================================ 

SELECT 
    UpdatedOn = CAST(SUBSTRING(MAX(bv.BinaryValue), 5, 8) AS DATETIME), 
    td.rescd_PurchaseOrderLine 
FROM 
    #TestData td 
    CROSS APPLY (VALUES (CAST(td.RN AS BINARY(4)) + CAST(td.UpdatedOn AS BINARY(8)))) bv (BinaryValue) 
WHERE 
    td.cd_POLineItemScheduledShipDate IS NOT NULL 
GROUP BY 
    td.rescd_PurchaseOrderLine; 

結果...

UpdatedOn    rescd_PurchaseOrderLine 
----------------------- ----------------------- 
2017-08-24 14:47:56.567 037-01714223-REF-1 
2017-08-24 14:47:56.567 037-01714223-REF-2 
+0

これは、ありがとう! – Mike

+0

問題ありません。お役に立てて嬉しいです。 :) –

0

これはあまりにも複雑ではありませんが、あなたの要件があいまいです:私はcd_POLineItemScheduledShipDateされていないNULLの最初のインスタンスを持つ行からUpdatedOn日付を取得しようとしています

上記の文では、「first」という単語は定義されていません。ソート順を指定しない限り、テーブルは順序付けられていないとみなされます。

クエリは次のようになり、私たちは、更新日時で注文したいと仮定すると:あなたが何か他のもの(例えば作成日)で注文したい場合は、少しだけより複雑だ

SELECT MIN(UpdatedOn) UpdatedOn 
FROM Shadow 
WHERE cd_POLineItemScheduledShipDate IS NULL 

SELECT TOP 1 UpdatedOn 
FROM Shadow 
WHERE cd_POLineItemScheduledShipDate IS NULL 
ORDER BY CreatedOn 

あなたが_rescd_PurchaseOrderLineの値ごとに結果セットに1行が必要な場合のことができますグループ:

SELECT MIN(UpdatedOn) UpdatedOn, _rescd_PurchaseOrderLine 
FROM Shadow 
WHERE cd_POLineItemScheduledShipDate IS NULL 
GROUP BY _rescd_PurchaseOrderLine 

または

SELECT FIRST_VALUE(UpdatedOn) OVER (ORDER BY CreatedOn) UpdatedOn, 
     _rescd_PurchaseOrderLine 
FROM Shadow 
WHERE cd_POLineItemScheduledShipDate IS NULL 
GROUP BY _rescd_PurchaseOrderLine 
+0

これはほとんど作品...後にしているものでなければなりません。 PurchaseOrderLineごとに1つの 'UpdatedOn'値が必要です。私がこれを実行すると、最初の数字* 037-01714223-REF-1 *の正しい日付が得られますが、2番目の数字は* 037-01714223-REF-2 *です。私は 'UpdatedOn DESC'によって注文し、2番目の数字は最小日付の代わりに2番目に古い日付を引いています。 – Mike

+0

私の質問に明確な説明が追加されました。 – Mike

関連する問題