【问题标题】:Merging 2 datasets with timestamp as unique identifiers (but they are not the same)合并 2 个带有时间戳的数据集作为唯一标识符(但它们不相同)
【发布时间】:2018-09-10 19:58:57
【问题描述】:

我有 2 个历史标签数据。我做 openquery 以在表中获取这些数据。数据是这样的:

标签1:

timestamp1 string1

标签2:

timestamp2 string2

我想把它合并到一张表中

timestamp1 string1 string2

问题是 Timestamp1 和 Timestamp2 不匹配。我需要在表中将 string1 和 string2 放在一起。有没有办法解决这个问题?此外,时间戳的差异可能会因情况而异。 (可以是 100ms 到 5sec)

例子:

Tag1 表:

   10/09/2018 22:05:00          "hello"

   10/09/2018 22:10:00          "heyhey"

Tag2 表:

  10/09/2018 22:05:28          "azeryy"

  10/09/2018 22:10:04          "qwerty"

结果表:

  10/09/2018 22:05:00          "hello"      "azeryy"

  10/09/2018 22:10:00          "heyhey"     "qwerty" 

【问题讨论】:

  • 样本数据和预期结果会有所帮助...
  • @sgeddes 是正确的,这会给你一个更好的答案。
  • 我加了一个例子
  • Timestamp 是一种与一天中的时间无关的数据类型。字符串是字符串,而不是日期时间。假设这些是日期时间,您希望加入如何工作?如果值不相同,您将如何确定哪一行属于哪一行?
  • @seanLange 这正是问题所在!

标签: sql sql-server tsql historian


【解决方案1】:

如果您将来可以发布示例数据,将会很有帮助。由于您是新来的,所以我为您整理了这些内容,以便您查看示例。

declare @Tag1 table
(
    SomeDate datetime
    , SomeValue varchar(20)
)

insert @Tag1 values
('10/09/2018 22:05:00', 'hello')
, ('10/09/2018 22:10:00', 'heyhey')

declare @Tag2 table
(
    SomeDate datetime
    , SomeValue varchar(20)
)

insert @Tag2 values
('10/09/2018 22:05:28', 'azeryy')
, ('10/09/2018 22:10:04', 'qwerty')

现在我们可以专注于手头的任务,将它们非常松散地合并在一起。 Row_Number 对此非常有帮助。您可以在此处阅读有关 ROW_NUMBER 的更多信息。 https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql?view=sql-server-2017

select t1.SomeDate
    , t1.SomeValue
    , t2.SomeValue
from
(
    select *
        , RowNum = ROW_NUMBER() over(order by SomeDate desc)
    from @Tag1
) t1
join
(
    select *
        , RowNum = ROW_NUMBER() over(order by SomeDate desc)
    from @Tag2
) t2 on t2.RowNum = t1.RowNum
order by t1.SomeDate

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 2021-08-25
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 2021-01-09
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多