Какой самый умный способ игнорировать пустые значения и показывать одно значение для столбца, который является частью большего запроса? - PullRequest
0 голосов
/ 24 января 2020

Я работаю с таблицей, которая выглядит примерно так:

|   |  Name | CaseID | UsrID | DL_NO |   SSN   | Address     | DateSeen   |
|---|:-----:|:------:|:-----:|:-----:|:-------:|-------------|------------|
| 1 | Smith |  AB190 | 88885 |       | 1234567 | 222 Side Rd | 01/01/2020 |
| 2 | Smith |  AB186 | 88885 | B0938 |         |             | 10/01/2019 |
| 3 | Smith |  AB170 | 88885 |       | 1234567 | 123 Side Rd | 09/01/2019 |
| 4 | Smith |  AB168 | 88885 | B0938 |         | 123 Road St | 03/05/2019 |
| 5 | Smith |  AB132 | 88885 | B0938 | 1234567 |             | 03/01/2019 |
| 6 | Smith |  AB102 | 88885 | B0938 | 1234567 | 123 Road St | 02/01/2019 |

У меня возникают проблемы с пониманием того, как правильно включать данные, которые обновляются / иногда содержат недостающие биты.

То, что я хотел бы увидеть, это самые свежие, ненулевые значения для каждого столбца:

|   |  Name | NumOfCases | UsrID | DL_NO |   SSN   | Address     |
|---|:-----:|:----------:|:-----:|:-----:|:-------:|-------------|
| 1 | Smith |      6     | 88885 | B0938 | 1234567 | 222 Side Rd |

Я использовал это:

SELECT TOP 50 Name, UsrID, COUNT(DISTINCT CaseID) as NumofCases
FROM People
WHERE DateSeen between 01/31/2019 and 10/02/2019
GROUP BY Name, UsrID
ORDER BY DateSeen desc

Возвращает

|   |  Name | UsrID | NumofCases |
|---|:-----:|-------|:----------:|
| 1 | Smith | 88885 |      6     |

Это работало нормально, пока я не понял, что могу использовать другие поля.

Когда я пытаюсь выполнить аналогичный запрос с дополнительными столбцами, принудительный вызов GROUP BY явно уничтожает счетчик «NumofCases».

Даже КРЕСТ-ПРИЛОЖЕНИЕ, где я "ВЫБИРАЮ ТОП-1", требует группировки по.

Есть мысли?

Ответы [ 3 ]

0 голосов
/ 24 января 2020

Вы можете попробовать запрос ниже -

SELECT Name
      ,COUNT(DISTINCT CaseID) OVER(PARTITION BY Name)
      ,UsrID
      ,MAX(DL_NO) DL_NO
      ,MAX(SSN) SSN
      ,MAX(Address) Address
      ,MAX(DateSeen) DateSeen
FROM People
WHERE DateSeen BETWEEN 01/31/2019 AND 10/02/2019
GROUP BY Name, UsrID
ORDER BY DateSeen desc
0 голосов
/ 24 января 2020

Если вы управляете моделью данных, нормализация таблиц значительно упростит задачу. Это также предотвратит несоответствия данных, такие как несоответствие адресов в данных вашего примера

create table People ( name, usrid, dl_no,ssn, address); --add data types
create table Case (usrid, dateseen, caseid);--add data types

create case_view as
select name,usrid,dl_no,ssn,address,dateseen,caseid
from people p join case c on p.usrid=c.usrid;

Тогда ваш запрос будет тривиальным

select name,usrid,dl_no,ssn,address,COUNT(DISTINCT CaseID) as NumofCases
from case_view
group by name,usrid,dl_no,ssn,address

, и вы сможете добавить фильтры даты или числа.

0 голосов
/ 24 января 2020

Это то, что может помочь:

SELECT TOP 50 Name, UsrID, COUNT(DISTINCT CaseID) as NumofCases,
(select top 1 b.DL_NO FROM People b where a.UsrID = b.UsrID and ltrim(rtrim(b.DL_NO)) <> '' and b.DL_NO is not null order by b.DateSeen desc) as DL_NO,
(select top 1 b.SSN  FROM People b where a.UsrID = b.UsrID and ltrim(rtrim(b.SSN)) <> '' and b.SSN is not null order by b.DateSeen desc) as SSN,
(select top 1 b.Address FROM People b where a.UsrID = b.UsrID and ltrim(rtrim(b.Address)) <> '' and b.Address is not null order by b.DateSeen desc) as Address,
FROM People a
WHERE DateSeen between '01/31/2019' and '10/02/2019'
GROUP BY Name, UsrID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...