Sql 我是否应该使用外部应用程序将身份证号码与人名关联?
我正在处理两张桌子。这些是我自己没有能力编辑的古老表格。在这种情况下,我必须使用给定的结构 其中一个有“CaseID”和事件代码,如下所示: 表1: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 | 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我已经编辑了我的帖子。我应该提到的是,表格的结构不是由我决定的,但是我当然不能像我同意你的那样对它们进行编辑。仅仅因为某些东西是旧的,并不意味着它不能被改变。仅仅因为你不确定如何修复设计,并不意味着我们不能向你展示如何修复。这正是我所需要的。谢谢你,德里克。