使用新数据动态更新列

时间:2019-06-05 15:51:11

标签: sql sql-server ssms

我正在处理具有超过10K值的SQL表,从本质上讲,它控制着一天中更新生产站的状态。当前,SQL Server将在当前时间戳上报告新消息-因此,每天可以为同一部分生成数百个新条目,而只更改“ Production_Status”和“ TimeStamp”列。我想创建一个新表,该表选择唯一的零件名称,然后有另外两列控制该零件的最新条目的显示。

我当前选择了数据-重新排序了数据,因此最新的时间戳记在列表上。我目前正在尝试创建此动态表,但是我不熟悉sql。

val input = spark.sparkContext.parallelize(11 to 17, 3)
input.toDF.withColumn("id",spark_partition_id).rdd.collect

res7: Array[org.apache.spark.sql.Row] = Array([11,0], [12,0], [13,1], [14,1], [15,2], [16,2], [17,2])

预期结果应该是一个NewTable,其行数基于总生产设施中的零件数量-此列将是静态的-然后另外两列将检查Originaltable的最新状态和时间戳,并更新newTable中的其他两列。

我不需要表创建方面的帮助,而更多的是基于另一个表的行更新逻辑。

非常感谢。

1 个答案:

答案 0 :(得分:0)

看起来您可以利用子联接为每个partNumber查找MAX statusDate,然后再联接回其自身,以便您可以获取与具有最大日期的记录相对应的lineStatus值。我只是让您插入/更新临时表,但这可能是您可以采用的一般方法。

-- New table that might already exist in your db, I am creating one here
declare @NewTable(
    partNumber int,
    lineStatus varchar(max),
    last_update datetime
)

-- To initially set up your table or to update your table later with new part numbers that were not added before
insert into @NewTable
select tpd.partNumber, tpd.lineStatus, tpd.lineStatusdate
from tblPLCData tpd
join (
    select partNumber, MAX(lineStatusdate) lineStatusDateMax
    from tblPLCData
    group by partNumber
) maxStatusDate on tpd.partNumber = maxStatusDate.partNumber
    and tpd.lineStatusdate = maxStatusDate.lineStatusDateMax
left join @NewTable nt on tbd.partNumber = nt.partNumber
where tpd.lineStatus like '_ Zone %' or tpd.lineStatus = 'Production' and nt.partNumber is null

-- To update your table whenever you deem it necessary to refresh it.  I try to avoid triggers in my dbs
update nt set nt.lineStatus = tpd.lineStatus, nt.lineStatusdate = tpd.lineStatusDate
from tblPLCData tpd
join (
    select partNumber, MAX(lineStatusdate) lineStatusDateMax
    from tblPLCData
    group by partNumber
) maxStatusDate on tpd.partNumber = maxStatusDate.partNumber
    and tpd.lineStatusdate = maxStatusDate.lineStatusDateMax
join @NewTable nt on tbd.partNumber = nt.partNumber
where tpd.lineStatus like '_ Zone %' or tpd.lineStatus = 'Production'