SQL 案例分配基于组均等分配

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

我正在尝试提出一种算法,可以根据不同的分组将患者列表平均分配给病例经理。

我的数据有一个表格,其中包含分配为低或高优先级的患者列表:

患者ID 优先
1
2
3
4
5

等等

我还有一个病例经理表,可以根据患者的优先级分配给这些患者。每个优先级分组有五名经理:

案例经理 优先
1
2
3
4
5
6
7
8
9
10

我正在尝试根据患者的优先级和案例经理分配的优先级向每个患者分配案例经理,以便每个案例经理在其优先级组内拥有尽可能接近相同数量的患者。我知道我必须将案例经理表连接到患者表,以便我可以在组内运行作业,但我不确定如何以平等分配案例经理的方式执行此操作。

此外,如果我每周运行此操作,我希望能够将现有的病例经理分配保留给第一组患者,并仅以相同的平均分配方式向新患者分配病例经理。例如,如果我今天运行这个程序,并且上面的五名患者获得了病例经理分配,那么我希望能够在下周当五名新患者进来时再次运行该程序,并且只为他们分配一名经理(因此最初的五名患者将保留他们原来的案件经理)。我最初的想法是将每个案例经理的分配总数保留为该表中的一列,这样当重新运行该算法时,我可以根据迄今为止分配的案例最少的人来进行新的分配。但我不完全确定如何做到这一点。

感谢任何人能给我的帮助!真的很感激。

sql
1个回答
0
投票

这是我的想法。也许他们会帮助你。

CREATE PROCEDURE AssignPatientsToCaseManagers 
AS
BEGIN
  -- Join Patient and CaseManager tables based on priority
  DECLARE @availableManagers TABLE (
      CaseManagerID INT PRIMARY KEY,
      CurrentAssignedPatients INT DEFAULT (0)
  );

  INSERT INTO @availableManagers (CaseManagerID)
  SELECT DISTINCT CaseManagerID
  FROM CaseManager;

  UPDATE am
  SET am.CurrentAssignedPatients = p.AssignedPatients
  FROM @availableManagers am
  INNER JOIN Patient p ON am.CaseManagerID = p.CaseManagerID;

  MERGE Patient p
  USING (
      SELECT PatientID, Priority, CaseManagerID
      FROM Patient
      WHERE CaseManagerID IS NULL -- Identify new patients only for updates
      UNION ALL
      SELECT PatientID, Priority, NULL AS CaseManagerID -- Include existing patients for initial assignment
  ) AS newPatients
  ON (p.PatientID = newPatients.PatientID)
  WHEN MATCHED AND p.CaseManagerID IS NULL THEN -- Assign case manager to new patients only
    UPDATE SET
      p.CaseManagerID = am.CaseManagerID,
      am.CurrentAssignedPatients = am.CurrentAssignedPatients + 1
  FROM @availableManagers am
  WHERE am.Priority = newPatients.Priority 
  AND am.CurrentAssignedPatients < (SELECT AVG(CurrentAssignedPatients) FROM @availableManagers); -- Threshold for available manager

  WHEN NOT MATCHED THEN -- Insert new patients (handled by UNION ALL)
    INSERT (PatientID, Priority)
    VALUES (newPatients.PatientID, newPatients.Priority);

  DROP TABLE @availableManagers;
END;
GO

EXEC AssignPatientsToCaseManagers;
说明:

创建临时表

@availableManagers
来存储病例经理 ID 并跟踪当前分配的患者。
MERGE
语句结合了
INSERT
UPDATE
功能。它将
Patient
表与包含新患者和现有患者的虚拟表连接起来(使用
UNION ALL
)。对于新患者
CaseManagerID IS NULL
,它会根据优先级和可用性从
@availableManagers
表中分配一名病例经理(使用子查询检查平均分配的患者)。现有患者将被跳过以保留他们的分配。

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