Sql 我是否应该使用外部应用程序将身份证号码与人名关联?

Sql 我是否应该使用外部应用程序将身份证号码与人名关联?,sql,tsql,Sql,Tsql,我正在处理两张桌子。这些是我自己没有能力编辑的古老表格。在这种情况下,我必须使用给定的结构 其中一个有“CaseID”和事件代码,如下所示: 表1: | CaseID | Event | Date | |:------:|:-----:|:--------:| | BL221 | FTA | 02/01/19 | | BL331 | FTA | 03/01/19 | | BL444 | FTA | 05/01/19 | | BL444 | FTA | 05/01/

我正在处理两张桌子。这些是我自己没有能力编辑的古老表格。在这种情况下,我必须使用给定的结构

其中一个有“CaseID”和事件代码,如下所示:

表1:

| CaseID | Event |   Date   |
|:------:|:-----:|:--------:|
|  BL221 |  FTA  | 02/01/19 |
|  BL331 |  FTA  | 03/01/19 |
|  BL444 |  FTA  | 05/01/19 |
|  BL444 |  FTA  | 05/01/19 |
|  BL881 |  FTA  | 12/01/19 |
|  BL991 |  BEW  | 05/01/19 |
|  BL995 |  BEW  | 12/01/19 |
单个CaseID可以有许多不同的事件,包括重复事件(BL444上有2个“FTA”事件)。在这种情况下,我对“自由贸易协定”感兴趣

我的另一个表将这些CaseID与个人、他们的姓名和用户id关联起来,如下所示:

表2:

| FirstName | LastName | UsrID | CaseID |
|:---------:|:--------:|:-----:|:------:|
|  Jessica  |   Smith  |  885  |  BL111 |
|  Jessica  |   Smith  |  885  |  BL221 |
|  Jessica  |   Smith  |  885  |  BL331 |
|  Jessica  |   Smith  |  885  |  BL444 |
|  Jessica  |  Stanley |  885  |  BL881 |
正如你所见,杰西卡最近结婚了。她的UsrID将保持不变(885),但我需要能够在查询中将她的新名称与该ID关联

我们使用CaseID来确定我们在时间中移动的方向,因为它们是连续的

如前所述,我只是简单地计算FTA事件的个人实例,计算每个案例ID的数量,并将他们(最新)的名字粘贴在事件的末尾。通过示例数据,我想看到:

|       Name       | UsrID | Hits | NumofCases |
|:----------------:|:-----:|:----:|:----------:|
| Stanley, Jessica |  885  |   5  |      4     |
|     Doe, John    |  225  |   2  |      1     |
到目前为止,我所尝试的:

SELECT TB.NAME_LAST + ', ' + TB.NAME_FIRST as Name,  TB.UsrID, COUNT(TB.UsrID) as Hits, COUNT(DISTINCT(TA.CaseID)) as NumofCases
FROM Table1 as TA
JOIN Table2 as TB on TA.CaseID = TB.CaseID
where TA.DT_COURT_EVENT between '20190201' and '20200101' and TA.Event = 'FTA'
group by TB.NAME_LAST + ', ' + TB.NAME_FIRST, TB.UsrID
order by Hits desc
这很接近,但当Jessica的名字改变后,那个讨厌的GROUP BY让我把所有的实例都分开了:

|       Name       | UsrID | Hits | NumofCases |
|:----------------:|:-----:|:----:|:----------:|
|  Smith, Jessica  |  885  |   4  |      3     |
|     Doe, John    |  225  |   2  |      1     |
| Stanley, Jessica |  885  |   1  |      1     |
所以我试了一下:

SELECT TB.UsrID, COUNT(TB.UsrID) as Hits, COUNT(DISTINCT(TA.CaseID)) as NumofCases, C.Name
from Table1 TA
JOIN Table2 as TB on TA.CaseID = TB.CaseID
OUTER APPLY (SELECT TOP 1 (C.NAME_LAST + ',' + C.NAME_First) as Name
                    FROM   Table2 C
                    WHERE  TA.CaseID = C.CaseID
                    ORDER  BY TA.Date desc) C
where TA.Date between '20190901' and '20200101' and TA.Event = 'FTA'
group by TB.UsrID, C.Name
order by Hits desc
因为我认为“选择前1名”是我想要的,但我得到的结果和以前一样

我想在这里避免XY问题,所以我为冗长和时髦的标题道歉。我只是想展示我所有的牌,以防我以一种低效的方式来做这件事


多谢各位

我明白了。这是一个奇怪的设置。您可以使用条件聚合:

select userid, count(*), count(distinct caseid),
       max(case when seqnum = 1 then name end)
from (select t1.*, t2.last_name + ' ' + t2.first_name as name
             row_number() over (partition by t2.usrid order by t1.date desc) as seqnum
      from table1 t1 join 
           table2 t2
           on t1.caseid = t2.caseid
      where t1.event = 'FA'
     ) t12
group by userid;

您可以像最初打算的那样使用
交叉应用
外部应用
,但您需要加入
UsrID
并确定排序顺序

SELECT ca.Name, t2.UsrID, COUNT(*) AS Hits, COUNT(DISTINCT t1.CaseID) AS NumofCases
FROM Table1 t1
INNER JOIN Table2 t2 ON t2.CaseID = t1.CaseID
CROSS APPLY (SELECT TOP 1 LastName + ', ' + FirstName as Name
             FROM Table2
             WHERE UsrID = t2.UsrID
             ORDER BY CaseID DESC) ca
WHERE t1.Event = 'FTA'
GROUP BY ca.Name, t2.UsrID

你怎么知道最近的名字?第二个表中没有排序列。看起来这里不需要外部应用程序。你如何找到“…他们最新的名字…”?正如Gordon提到的,没有任何列告诉你日期或类似的信息。似乎你不应该在
表2中存储此人的姓名和用户ID;用户名(和其他详细信息)应位于用户详细信息表中,该表始终包含用户的当前名称。不是你“需要”外部应用,而是设计需要修正。如果您需要存储历史数据(如旧名称),请创建历史表或使用临时表。@Larnu我已经编辑了我的帖子。我应该提到的是,表格的结构不是由我决定的,但是我当然不能像我同意你的那样对它们进行编辑。仅仅因为某些东西是旧的,并不意味着它不能被改变。仅仅因为你不确定如何修复设计,并不意味着我们不能向你展示如何修复。这正是我所需要的。谢谢你,德里克。