1

必要な結果を取得するためのクエリを作成するのに問題があります。私は次の表を持っています:

CREATE TABLE [dbo].[inputs](
    [iid] [int] IDENTITY(1,1) NOT NULL,
    [tag_id] [int] NULL,
    [date_time] [datetime] NULL,
    [input_raw] [float] NULL,
    [input_calibrated] [float] NULL,
    [input_type] [varchar](50) NULL,
    [virtual_record] [varchar](50) NULL,
    [status_change] [varchar](50) NULL,
    [prev_stat_chg] [varchar](50) NULL,
    [prev_status_change] [varchar](50) NULL,
    [unix_timestamp] [float] NULL,
 CONSTRAINT [PK_inputs] PRIMARY KEY CLUSTERED 
(
    [iid] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,   ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]`
)

私が持っているタイムライングラフで使用できる形式でデータを取得するためのクエリを書いています。tag_idの「input_raw」の数が「n」のデータ「GroupedBy」「unix_timestamp」が必要です。

例えば:

SELECT TOP 20 inputs.unix_timestamp, inputs.input_raw, inputs.tag_id 
FROM [200030].[dbo].inputs
WHERE inputs.tag_id = 92149 or inputs.tag_id = 92164
ORDER BY unix_timestamp DESC

結果を教えてください:

unix_timestamp  input_raw   tag_id
1357788990  313         92149
1357788990  210         92164
1357788690  313         92149
1357788690  210         92164
1357788390  313         92149
1357788390  210         92164
1357788090  313         92149
1357788090  210         92164
1357787790  313         92149
1357787790  210         92164
1357787490  313         92149
1357787490  210         92164
1357787190  313         92149
1357787190  210         92164
1357786890  313         92149
1357786890  210         92164
1357786590  313         92149
1357786590  210         92164
1357786290  313         92149
1357786290  210         92164

次のような結果が必要です。

unix_timestamp     tag(92149)     tag(92164)
1357788990         313            210
1357788690         313            210
|
|
Vetc...

また、タイムスタンプに他のタグのデータがある場合、1つのタグから欠落しているデータがある場合は、文字列「undefined」または「NULL」が必要です。

何か助けはありますか?

4

3 に答える 3

1
SELECT  unix_timestamp,
        MAX(CASE WHEN tag = 92149 THEN input_raw ELSE NULL END) [tag92149],
        MAX(CASE WHEN tag = 92164 THEN input_raw ELSE NULL END) [tag92164]
FROM    tableName
GROUP BY unix_timestamp

また

SELECT unix_timestamp, [92149] As tag92149, [92164] as tag92164
FROM
    (
      SELECT    unix_timestamp, 
                tag,
                input_raw
      FROM      tableName
    ) a
    PIVOT
    (
      MAX(input_raw)
      for tag in ([92149], [92164])
    ) b
于 2013-01-10T15:59:59.410 に答える
1

これはピボット クエリです。以下を使用して、任意のデータベースでこれを行うことができます。

select unix_timestamp, 
       max(case when tag = 92149 then input_raw end) as tag_92349,
       max(case when tag = 92164 then input_raw end) as tag_92164
from (SELECT TOP 20 inputs.unix_timestamp, inputs.input_raw, inputs.tag_id 
     FROM [200030].[dbo].inputs
     WHERE inputs.tag_id = 92149 or inputs.tag_id = 92164
    ) t
group by unix_timestamp
ORDER BY unix_timestamp DESC
于 2013-01-10T16:00:26.380 に答える
1

これはデータのピボットです。使用している RDBMS を指定しませんでしたが、すべてのデータベースで次のものを使用できます。

SELECT unix_timestamp,
  max(case when inputs.tag_id = 92149 then input_raw else null end) tag_92149,
  max(case when inputs.tag_id = 92164 then input_raw else null end) tag_92164
FROM [200030].[dbo].inputs
GROUP BY unix_timestamp

デモで SQL Fiddle を参照してください

関数 (SQL Server/Oracle) を備えたデータベースを使用している場合は、PIVOT次を使用できます。

select *
from
(
  select unix_timestamp,
    input_raw,
    tag_id 
  from [200030].[dbo].inputs
) src
pivot
(
  max(input_raw)
  for tag_id in ([92149], [92164])
) piv

デモで SQL Fiddle を参照してください

両方の結果は次のとおりです。

| UNIX_TIMESTAMP | 92149 | 92164 |
----------------------------------
|     1357786290 |   313 |   210 |
|     1357786590 |   313 |   210 |
|     1357786890 |   313 |   210 |
|     1357787190 |   313 |   210 |
|     1357787490 |   313 |   210 |
|     1357787790 |   313 |   210 |
|     1357788090 |   313 |   210 |
|     1357788390 |   313 |   210 |
|     1357788690 |   313 |   210 |
|     1357788990 |   313 |   210 |
于 2013-01-10T16:00:31.610 に答える