我有以下数据库表数据。
此处
Data
列具有 JSON 数据。我们只需要多次获取具有相同BatchId
的那些数据。我们需要一个与最早的BatchId
相同的Timestamp
条目。
我在带有查询的过程中创建了以下 TempTable,
SELECT
JSON_VALUE(a.Data, '$.BatchId') BatchID, COUNT(JSON_VALUE(a.Data, '$.BatchId')) AS BatchIDCount, a.Name
INTO #BULKDOCUMENT
FROM Table1 a
GROUP BY
JSON_VALUE(a.Data, '$.BatchId'), a.Name
HAVING COUNT(JSON_VALUE(a.Data, '$.BatchId')) > 1
这给了我以下输出。
你能帮我看看如何从 SQL Server 存储过程返回所需的数据吗?
创建一个存储过程,比如-
CREATE PROCEDURE GetBulkData
AS
BEGIN
SELECT JSON_VALUE(a.Data, '$.BatchId') BatchID,
COUNT(JSON_VALUE(a.Data, '$.BatchId')) AS BatchIDCount,
a.Name
FROM Table1 a
GROUP BY JSON_VALUE(a.Data, '$.BatchId'), a.Name
HAVING COUNT(JSON_VALUE(a.Data, '$.BatchId')) > 1;
END;
使用 - 执行此 sp
EXEC GetBulkData;
您没有具体说明您需要帮助的具体内容。我假设您正在为如何进行聚合而苦苦挣扎,其中分组行仅包含组中最早行的值。
您需要使用窗口函数并按批次 ID 对行进行排序。
with sorted_batches as (
select
t.RecordID,
t.Timestamp,
t.Data,
t.Category,
JSON_VALUE(t.Data, '$.Name') as Name,
JSON_VALUE(t.Data, '$.BatchId') as BatchID,
row_number() over(partition by JSON_VALUE(t.Data, '$.BatchId'), order by t.Timestamp asc) as position_in_batch,
count(*) over (partition by JSON_VALUE(t.Data, '$.BatchId')) AS record_count_in_batch
from table1 t
)
select
bt.Timestamp,
json_object('RecordId': bt.RecordID, 'Name': bt.Name, 'Count', bt.record_count_in_batch) as Data,
bt.Category,
from sorted_batches bt
where bt.position_in_batch = 1;
json_object
函数将字段拼接成一个JSON文档。我使用 count
和 row_number
窗口函数进行聚合。