SQL 存储过程使用 group by 返回同一 ID 的单个记录

问题描述 投票:0回答:2

我有以下数据库表数据。

我必须编写 SQL 存储过程来获取以下输出数据。

此处

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 存储过程返回所需的数据吗?

sql sql-server stored-procedures
2个回答
0
投票

创建一个存储过程,比如-

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;


0
投票

您没有具体说明您需要帮助的具体内容。我假设您正在为如何进行聚合而苦苦挣扎,其中分组行仅包含组中最早行的值。

您需要使用窗口函数并按批次 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
窗口函数进行聚合。

© www.soinside.com 2019 - 2024. All rights reserved.