Как посчитать пары ключ-значение в столбце в формате json - PullRequest
1 голос
/ 18 июня 2019

У меня есть следующие данные в формате JSON в столбце («Данные»), который должен быть запрошен: Запись 1:

{  
    "actions":[  
        {  
            "class":"Action",
            "entries":[  
                {  
                    "class":"Entry",
                    "id":null,
                    "key":"StartTime",
                    "performance":{  
                        "class":"Performance",
                        "origin":null,
                        "originUuid":null,
                        "performanceDateTime":1560858977855,
                        "performerUuid":{  
                            "class":"java.util.UUID",
                            "UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e7"
                        },
                        "registrationDateTime":null,
                        "userUuid":null
                    },
                    "type":"O",
                    "value":"\"2019-06-17T11:58:38.000Z\""
                },
                {  
                    "class":"Entry",
                    "id":null,
                    "key":"StartedBy",
                    "performance":{  
                        "class":"Performance",
                        "origin":null,
                        "originUuid":null,
                        "performanceDateTime":1560858977855,
                        "performerUuid":{  
                            "class":"java.util.UUID",
                            "UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e7"
                        },
                        "registrationDateTime":null,
                        "userUuid":null
                    },
                    "type":"C_R",
                    "value":"1019"
                }
            ]
        }
    ]
}

Запись 2:

{  
    "actions":[  
        {  
            "class":"Action",
            "entries":[  
                {  
                    "class":"Entry",
                    "id":null,
                    "key":"StartTime",
                    "performance":{  
                        "class":"Performance",
                        "origin":null,
                        "originUuid":null,
                        "performanceDateTime":1560863293329,
                        "performerUuid":{  
                            "class":"java.util.UUID",
                            "UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e7"
                        },
                        "registrationDateTime":null,
                        "userUuid":null
                    },
                    "type":"O",
                    "value":null
                },
                {  
                    "class":"Entry",
                    "id":null,
                    "key":"StopTime",
                    "performance":{  
                        "class":"com.bma.common.dto.Performance",
                        "origin":null,
                        "originUuid":null,
                        "performanceDateTime":1560863293329,
                        "performerUuid":{  
                            "class":"java.util.UUID",
                            "UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e7"
                        },
                        "registrationDateTime":null,
                        "userUuid":null
                    },
                    "type":"O",
                    "value":"\"2019-06-18T13:08:42.000Z\""
                },
                {  
                    "class":"Entry",
                    "id":null,
                    "key":"StartedBy",
                    "performance":{  
                        "class":"Performance",
                        "origin":null,
                        "originUuid":null,
                        "performanceDateTime":1560858977855,
                        "performerUuid":{  
                            "class":"java.util.UUID",
                            "UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e6"
                        },
                        "registrationDateTime":null,
                        "userUuid":null
                    },
                    "type":"C_R",
                    "value":"1018"
                }
            ]
        }
    ]
}

Что теперьМне нужно установить, есть ли время остановки для каждого времени запуска, чтобы определить, есть ли еще какие-либо текущие действия.Обратите внимание, что первая запись не имеет объекта с ключом StopTime.Есть также записи без ключа StartTime.И, см. Запись 2, объекты с ключом StartTime могут иметь нулевое значение.Это также относится к объектам с ключом StopTime.Я придумал следующий sql, который еще далек от завершения:

SELECT ca1.[value] AS StartTimeCol,
ca2.[value] AS StopTimeCol
FROM queriedTable qu
CROSS APPLY OPENJSON(qu.Data, '$.actions')
WITH (
entries nvarchar(max) '$.entries' AS JSON
) j
CROSS APPLY OPENJSON(j.entries)
WITH (
[key] nvarchar(100) '$.key',
[value] nvarchar(100) '$.value'
) ca1
CROSS APPLY OPENJSON(j.entries)
WITH (
[key] nvarchar(100) '$.key',
[value] nvarchar(100) '$.value'
) ca2
WHERE
ca1.[key] = 'StartTime' OR
ca2.[key] = 'StopTime'

Очевидно, я пришел к подсчету StartTimes и StopTimes;Что меня удивляет, так это то, что результат дает мне в столбцах StartTimeCol и StopTimeCol значения из других объектов, таких как «1019» и «1018», хотя я явно заявляю, что должны рассматриваться только ключи StartTime и StopTime.Как так?И как я могу установить в одном запросе, является ли количество StopTimes больше или равно количеству StartTimes?

Thx!

1 Ответ

0 голосов
/ 18 июня 2019

Если я правильно понимаю ваш вопрос, следующий подход может помочь:

Таблица:

CREATE TABLE queriedTable (
   Data nvarchar(max)
)
INSERT INTO queriedTable 
   (Data)
VALUES
    (N'{  
    "actions":[  
        {  
            "class":"Action",
            "entries":[  
                {  
                    "class":"Entry",
                    "id":null,
                    "key":"StartTime",
                    "performance":{  
                        "class":"Performance",
                        "origin":null,
                        "originUuid":null,
                        "performanceDateTime":1560858977855,
                        "performerUuid":{  
                            "class":"java.util.UUID",
                            "UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e7"
                        },
                        "registrationDateTime":null,
                        "userUuid":null
                    },
                    "type":"O",
                    "value":"\"2019-06-17T11:58:38.000Z\""
                },
                {  
                    "class":"Entry",
                    "id":null,
                    "key":"StartedBy",
                    "performance":{  
                        "class":"Performance",
                        "origin":null,
                        "originUuid":null,
                        "performanceDateTime":1560858977855,
                        "performerUuid":{  
                            "class":"java.util.UUID",
                            "UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e7"
                        },
                        "registrationDateTime":null,
                        "userUuid":null
                    },
                    "type":"C_R",
                    "value":"1019"
                }
            ]
        }
    ]
}'
   ),
   (N'{  
    "actions":[  
        {  
            "class":"Action",
            "entries":[  
                {  
                    "class":"Entry",
                    "id":null,
                    "key":"StartTime",
                    "performance":{  
                        "class":"Performance",
                        "origin":null,
                        "originUuid":null,
                        "performanceDateTime":1560863293329,
                        "performerUuid":{  
                            "class":"java.util.UUID",
                            "UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e7"
                        },
                        "registrationDateTime":null,
                        "userUuid":null
                    },
                    "type":"O",
                    "value":null
                },
                {  
                    "class":"Entry",
                    "id":null,
                    "key":"StopTime",
                    "performance":{  
                        "class":"com.bma.common.dto.Performance",
                        "origin":null,
                        "originUuid":null,
                        "performanceDateTime":1560863293329,
                        "performerUuid":{  
                            "class":"java.util.UUID",
                            "UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e7"
                        },
                        "registrationDateTime":null,
                        "userUuid":null
                    },
                    "type":"O",
                    "value":"\"2019-06-18T13:08:42.000Z\""
                },
                {  
                    "class":"Entry",
                    "id":null,
                    "key":"StartedBy",
                    "performance":{  
                        "class":"Performance",
                        "origin":null,
                        "originUuid":null,
                        "performanceDateTime":1560858977855,
                        "performerUuid":{  
                            "class":"java.util.UUID",
                            "UUID":"2647a005-a3a8-4362-8f2d-ddd188f500e6"
                        },
                        "registrationDateTime":null,
                        "userUuid":null
                    },
                    "type":"C_R",
                    "value":"1018"
                }
            ]
        }
    ]
}')

T-SQL:

SELECT
   RANK() OVER (ORDER BY qu.Data) Rn,
   COUNT(*) OVER (PARTITION BY qu.Data) [Count],
   b.*
FROM queriedTable qu
CROSS APPLY OPENJSON(qu.Data, '$.actions') WITH (
   Data nvarchar(max) '$.entries' AS JSON
) a
CROSS APPLY OPENJSON(a.Data)  WITH (
   [key] nvarchar(max) '$.key',
   [value] nvarchar(max) '$.value'
) b
WHERE b.[key] = 'StartTime' OR b.[key] = 'StopTime'

Выход:

Rn  Count   key          value
1   1       StartTime   "2019-06-17T11:58:38.000Z"
2   2       StartTime   
2   2       StopTime    "2019-06-18T13:08:42.000Z"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...