How to normalize incoming events in a Stream Analytics job

If you want to normalize the incoming events in a Stream Analytics job and transform records with the following format:

Time Id P1 P2 P3
2015-12-16T10:00:01.0000000Z 01 15 30 10
2015-12-16T10:00:01.0000000Z 02 25 40 20
2015-12-16T10:00:01.0000000Z 03 45 18 5
2015-12-16T10:00:01.0000000Z 04 20 23 56

to the following format:

Time Id Type Value
2015-12-16T10:00:01.0000000Z 01 P1 15
2015-12-16T10:00:01.0000000Z 01 P2 30
2015-12-16T10:00:01.0000000Z 01 P3 10
2015-12-16T10:00:01.0000000Z 02 P1 25
2015-12-16T10:00:01.0000000Z 02 P2 40
2015-12-16T10:00:01.0000000Z 02 P3 20
2015-12-16T10:00:01.0000000Z 03 P1 45
2015-12-16T10:00:01.0000000Z 03 P2 18
2015-12-16T10:00:01.0000000Z 03 P3 5
2015-12-16T10:00:01.0000000Z 04 P1 20
2015-12-16T10:00:01.0000000Z 04 P2 23
2015-12-16T10:00:01.0000000Z 04 P3 56

you can use the GetRecordProperties function and CROSS APPLY operator as shown by the following query:

 SELECT e.Time, e.Id, record.PropertyName as Type, record.PropertyValue AS Value
FROM Events e
CROSS APPLY GetRecordProperties (e) AS record
WHERE record.PropertyName = 'p3' OR
      record.PropertyName = 'p2' OR
      record.PropertyName = 'p3'

You can use the following input file to test the Stream Analytics query on the Azure Management portal.

 [
  {
    "Time": "2015-12-16T10:00:01.0000000Z",
    "Id": "01",
    "P1": 15,
    "P2": 30,
    "P3": 10,
  },
  {
    "Time": "2015-12-16T10:00:01.0000000Z",
    "Id": "02",
    "P1": 25,
    "P2": 40,
    "P3": 20,
  },
  {
    "Time": "2015-12-16T10:00:01.0000000Z",
    "Id": "03",
    "P1": 45,
    "P2": 18,
    "P3": 5,
  },
  {
    "Time": "2015-12-16T10:00:01.0000000Z",
    "Id": "04",
    "P1": 20,
    "P2": 23,
    "P3": 56,
  }
]

Running the query against the test file returns the following dataset:

Time Id Type Value
2015-12-16T10:00:01.0000000Z 01 P1 15
2015-12-16T10:00:01.0000000Z 01 P2 30
2015-12-16T10:00:01.0000000Z 01 P3 10
2015-12-16T10:00:01.0000000Z 02 P1 25
2015-12-16T10:00:01.0000000Z 02 P2 40
2015-12-16T10:00:01.0000000Z 02 P3 20
2015-12-16T10:00:01.0000000Z 03 P1 45
2015-12-16T10:00:01.0000000Z 03 P2 18
2015-12-16T10:00:01.0000000Z 03 P3 5
2015-12-16T10:00:01.0000000Z 04 P1 20
2015-12-16T10:00:01.0000000Z 04 P2 23
2015-12-16T10:00:01.0000000Z 04 P3 56