如何在SQL中第一次输入日期?

时间:2017-08-28 19:43:17

标签: sql-server

我有一个SQL表,用于保存另一个表的所有更新。每次更新另一个表中的某些内容时,此Shadow表将获取包含更新前所有数据的新行。它看起来像这样:

+--------------------------------+-------------------------+-------------------------+--------------------------+
| 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,然后有几行不为null。 (这是按UpdatedOn desc

排序的

我想从UpdatedOn为每个采购订单行订购的第一个cd_PolineItemScheduledShipDate实例不是NULL的行中获取UpdatedOn desc日期。因此,对于下面的示例,我希望结果为:

+-------------------------+--------------------------+
|        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       |
+-------------------------+--------------------------+

我已尝试使用joinsgroups并使用maxmin进行了一些操作,但我还没有得到它。< / p>

如果有人能指出我正确的方向,我会很感激!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这并不复杂,但你的要求含糊不清:

  

我正在尝试从行中获取UpdatedOn日期,而cd_PolineItemScheduledShipDate的第一个实例不是NULL。

在上面的句子中,单词&#34; first&#34;没有定义。除非您指定排序顺序,否则表被视为无序。

假设我们想按更新日期排序,查询将如下所示:

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在结果集中需要一行,则可以分组:

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