簡體   English   中英

如何基於SQL Server中其他表上的時間戳記條目在表中獲取最新的用戶udpated列值?

[英]How do i get the latest user udpated column value in a table based on timestamp entry on a different table in SQL Server?

我有一個臨時表#StatusInfo,其中包含以下數據

+---------+--------------+-------+-------------------------+--+
| OrderNo | GroupLineNum | Type1 | UpdateDate              |  |
+---------+--------------+-------+-------------------------+--+
| Order85 | NULL         | 1     | 2019-11-25 05:15:55.000 |  |
+---------+--------------+-------+-------------------------+--+
| Order86 | NULL         | 1     | 2019-11-25 05:15:55.000 |  |
+---------+--------------+-------+-------------------------+--+
| Order86 | 2            | 2     | 2019-11-25 05:32:23.773 |  |
+---------+--------------+-------+-------------------------+--+
| Order87 | NULL         | 1     | 2019-11-25 05:15:55.000 |  |
+---------+--------------+-------+-------------------------+--+
| Order87 | 1            | 2     | 2019-11-25 05:43:37.637 |  | B
+---------+--------------+-------+-------------------------+--+
| Order87 | 2            | 2     | 2019-11-25 05:42:32.390 |  | A
+---------+--------------+-------+-------------------------+--+
| Order88 | NULL         | 1     | 2019-11-25 06:35:13.000 |  |
+---------+--------------+-------+-------------------------+--+
| Order88 | 1            | 2     | 2019-11-25 06:39:16.170 |  |
+---------+--------------+-------+-------------------------+--+

用戶對訂單所做的任何更新都將被拉入此臨時表。 類型1列的值為2表示用戶更改了“必需日期”字段。 用戶進行更改的時間戳記是最后一列。

我還有另一個臨時表#LineInfo,其中包含以下數據。 該表是通過聯接其他表並與上面的表進行左聯接而創建的。 下表中的“ LineNum”列與上表中針對Type1 = 2的“ GroupLineNum”列匹配

+---------+-----------+---------+------------+-------------------------+-------+
| OrderNo | RowNumber | LineNum | TotalCost  | ReqDate                 | Type1 |
+---------+-----------+---------+------------+-------------------------+-------+
| Order85 | 1         | 1       | 309.110000 | 2019-10-30 23:59:00.000 | 1     |
+---------+-----------+---------+------------+-------------------------+-------+
| Order85 | 2         | 2       | 265.560000 | 2019-10-30 23:59:00.000 | 1     |
+---------+-----------+---------+------------+-------------------------+-------+
| Order86 | 1         | 1       | 309.110000 | 2019-10-30 23:59:00.000 | 1     |
+---------+-----------+---------+------------+-------------------------+-------+
| Order86 | 2         | 2       | 265.560000 | 2019-12-28 23:59:00.000 | 2     |
+---------+-----------+---------+------------+-------------------------+-------+
| Order87 | 1         | 1       | 309.110000 | 2020-01-31 23:59:00.000 | 2     |
+---------+-----------+---------+------------+-------------------------+-------+
| Order87 | 2         | 2       | 265.560000 | 2020-01-01 23:59:00.000 | 2     |
+---------+-----------+---------+------------+-------------------------+-------+
| Order88 | 1         | 1       | 309.110000 | 2019-11-29 23:59:00.000 | 2     |
+---------+-----------+---------+------------+-------------------------+-------+
| Order88 | 2         | 2       | 265.560000 | 2019-12-31 23:59:00.000 | 2     |
+---------+-----------+---------+------------+-------------------------+-------+

我將#lineInfo與其他表結合起來,以生成一個僅包含一個orderno記錄的新表。 按orderno分組。

我需要做的是確保新的selectquery具有“ ReqDate”列,該列將是訂單的最新ReqDate值。

例如,Order87在訂單中有兩行。 用戶首先在'2019-11-25 05:42:32.390'更新了第2行,如標記為'A'的行中所示,隨后是第一個表中標記為B @'2019-11-25 05:43:37.637'的行1 。 新查詢應該具有LineInfo的數據,並且只有與“ LineNum”匹配的“ ReqDate”值與Type1 = 2的最大值為“ UpdateDate”列,並且按orderno分組。 因此,在我們的示例中,輸出應具有ReqDate值'2020-01-31 23:59:00.000'。

簡而言之,訂單應具有最近更新的要求日期。 訂單中可以包含多個reqdate的訂單項。 如果#StatusInfo表中沒有類型為訂單的條目,則#LineInfo表中的ReqDate值中的任何一個就足夠了。 也許第一行

我寫了這樣的東西,但是它沒有在StatusInfo表中沒有任何輸入的情況下不會拉訂單。 這些訂單將具有默認值,即使用戶未進行過udpate,我也不確定如何將其結果與LineInfo表連接以設置最新值

Select SIT.Orderno, max_date,grouplinenum
from #StatusInfo SIT
inner join 
(SELECT Orderno, MAX(ActDate) as max_date
FROM #StatusInfo SI
WHERE SI.Type1=2
GROUP BY SI.Orderno)a
on a.Orderno = SIT.Orderno and a.max_date = SIT.ActDate

這就是我所做的。 我創建了打擊CTE,以按更新日期的順序加載需要更改日期的訂單,並為其分配了行號。 第1行的記錄將是最近更新的日期

    ;WITH cteLatestReqDate AS ( --We need to pull the latest ReqDate value the user set. So we are are ordering the SIT table by ActDate and assigning a row number and respective line's required date here
        SELECT SIT.OrderNo, SIT.UpdateDate, SIT.GroupLineNum, LLI.ReqDate,
           ROW_NUMBER() OVER (PARTITION BY SIT.OrderNo ORDER BY ActDate DESC) AS RowNum
        FROM #StatusInfo SIT INNER JOIN #LineLevelInfo LLI ON SIT.OrderNo = OI.OrderNo AND SIT.GroupLineNum = LLI.LineNum
        WHERE SIT.Type1 = 2
    )

然后將以下條件添加到我的選擇查詢中。 下面的選擇查詢是局部的

SELECT
CASE WHEN MAX(LRD.ReqDate) IS NULL THEN CAST(FORMAT(MAX(LLI.ReqDate), 'yyMMdd') AS NVARCHAR(10))
        ELSE CAST(FORMAT(MAX(LRD.ReqDate), 'yyMMdd') AS NVARCHAR(10)) END AS LatestReqDate
FROM #LineLevelInfo LLI
LEFT JOIN(SELECT * FROM cteLatestReqDate WHERE RowNum = 1)LRD ON LRD.OrderNo = LLI.OrderNo And LRD.GroupLineNum = LLI.LineNum 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM