我有一个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 |
+-------------------------+--------------------------+
我已尝试使用joins
和groups
并使用max
或min
进行了一些操作,但我还没有得到它。< / p>
如果有人能指出我正确的方向,我会很感激!
答案 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