棘手的SQL SELECT语句-将两行合并为两列

Tom*_*han 2 sql t-sql group-by sql-server-2005

我的问题:
我有一个带有a Channel <int>和一Value <float>列的表,以及一个时间戳和另外两个带有附加数据的列。Channel12,并且存在1或2行,除了channel和value以外,其他所有行都相同。

我想做的是将此数据选择为新形式,其中两个通道显示为列。我尝试使用进行操作GROUP BY,但无法弄清楚如何根据同一行的通道将值放入正确的列中。

示例:
对于那些宁愿查看我拥有的数据和想要的数据并从那里弄清楚的人,就在这里。是)我有的:

 Channel    Value       Timestamp                OtherStuff
 1          0.2394      2010-07-09 13:00:00      'some other stuff'
 2          1.2348      2010-07-09 13:00:00      'some other stuff'
 1          24.2348     2010-07-09 12:58:00      'some other stuff'
 2          16.3728     2010-07-09 12:58:00      'some other stuff'
 1          12.284      2010-07-09 13:00:00      'unrelated things'
 2          9.6147      2010-07-09 13:00:00      'unrelated things'
Run Code Online (Sandbox Code Playgroud)

我想要的是:

Value1     Value2      Timestamp                OtherStuff
0.2394     1.2348      2010-07-09 13:00:00      'some other stuff'
24.2348    16.3728     2010-07-09 12:58:00      'some other stuff'
12.284     9.6147      2010-07-09 13:00:00      'unrelated things'
Run Code Online (Sandbox Code Playgroud)

更新以回应评论中出现的一些问题,以及一些后续问题/说明:

  • 是的,是的组合TimestampOtherStuff两个排连接在一起。(OtherStuff实际上是不止一列,但为简便起见,我对此进行了简化。)还有其他两列不一定相等,但应保持原样。

  • 所讨论的表已经从两个表中,其中加入了ValueChannelTimestamp来自它们中的一个,其余的(共7更多的列,的外面4总是相等为“链接”的行,和其他三个大多不)。有一些建议在使用INNER JOIN-如果我已经将东西连在一起(即使我没有自己要加入的东西),这些建议是否仍然有效myTable

  • 很多具有相同时间戳的行,因此我需要我要连接的两个表中的信息以弄清楚将哪些行链接在一起。

  • 我有很多数据。输入来自遍布全国的测量设备,其中大多数(如果不是全部)每2分钟上传一次测量(最多4个通道)。目前,我们有大约1000台设备在线,因此平均每分钟大约增加1000行。我需要考虑的值至少为3小时,最好是6小时,这意味着表中包含通道,值和时间戳的行数为18万至36万。

gbn*_*gbn 5

只要您有链接两行的东西,像这样的东西

SELECT
    c1.Value AS Value1, c2.Value AS Value2, c1.timestamp, c2.otherstuff
FROM
    MyTable c1
    JOIN
    MyTable c2 ON c1.timestamp = c2.timestamp AND c1.otherstuff = c2.otherstuff
WHERE
    c1.Channel = 1 AND c2.Channel = 2
Run Code Online (Sandbox Code Playgroud)

如果没有任何可链接两行的内容,则可能无法完成,因为您如何知道它们是配对的?

如果您有1 2行(编辑:并且不知道您拥有哪个通道值)

SELECT
    c1.Value AS Value1, c2.Value AS Value2, c1.timestamp, c2.otherstuff
FROM
    (
     SELECT Value, timestamp, otherstuff
     FROM MyTable
     WHERE Channel = 1
    ) c1           
    FULL OUTER JOIN
    (
     SELECT Value, timestamp, otherstuff
     FROM MyTable
     WHERE Channel = 2
    ) c2 ON c1.timestamp = c2.timestamp AND c1.otherstuff = c2.otherstuff                  
Run Code Online (Sandbox Code Playgroud)