如何根据SQL Server中不同表上的时间戳条目获取表中最新的用户自定义列值?

如何根据SQL Server中不同表上的时间戳条目获取表中最新的用户自定义列值?,sql,sql-server,Sql,Sql Server,我有一个临时表#StatusInfo,其中包含以下数据 +---------+--------------+-------+-------------------------+--+ | OrderNo | GroupLineNum | Type1 | UpdateDate | | +---------+--------------+-------+-------------------------+--+ | Order85 | NULL | 1

我有一个临时表#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 |  |
+---------+--------------+-------+-------------------------+--+
用户对订单所做的任何更新都将被拉入此临时表。值为2的类型1列表示用户对“必需日期”字段的更改。用户进行更改时的时间戳是最后一列

我有另一个临时表#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生成一个只有一条记录的新表。它按订单号分组

我需要做的是确保新的selectquery将有一列“ReqDate”,它将是订单的最新ReqDate值

例如,Order87在订单中有两行。用户首先在“2019-11-25 05:42:32.390”处更新了第2行,如标记为“A”的行中所示,然后在第一个表中标记为“2019-11-25 05:43:37.637”的行中更新了第1行。 新查询应具有LineInfo中的数据,并且只有与“LineNum”匹配的“ReqDate”值,该值的最大值为“UpdateDate”列(Type1=2)和group by orderno。 因此,在我们的示例中,输出应具有ReqDate值“2020-01-31 23:59:00.000”

简言之,订单应具有最近更新的所需日期。订单可以有多个行项目,其中reqdate是自定义的。如果订单的#StatusInfo表中没有类型为2的条目,则#LineInfo表中的任何一个ReqDate值都足够了。也许是第一行

我写了类似这样的东西,但它不会在StatusInfo表中没有任何条目的情况下提取订单。这些订单将有一个默认值,即使用户没有自定义,我也不知道如何将此结果与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

这就是我所做的。我创建了blow CTE以加载订单,并按照更新日期的顺序更改了req日期,并为其分配了行编号。行号为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查询中。下面选择查询是部分的

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 

“用户对订单所做的任何更新都将被拉入这个临时表中。”这听起来不像是一个非常临时的临时表。可能是@Larnu的重复。你是对的。还有另一个表记录了这些用户操作,但我根据某些条件过滤了这些记录,并创建了上面的StatusInfo temptable@Larnu您提到的链接的所有数据都在同一个表中。我的表被分成两部分,然后我必须显示相同的表,但有一个共同的值。这就是我困惑的地方,不要在表格中思考,而是在数据集中思考。使用
联接的查询返回1个数据集;不是2。