Многоуровневая SQL фильтрация по самой последней дате - PullRequest
0 голосов
/ 14 апреля 2020

Я выбрал самые последние данные из базы данных, но мне нужно расширить запрос сейчас. На данный момент у меня есть

from tblUserProperties inner join  
(   select TOP(1) id from tblUserProperties     
        where updated=( 
        Select max(updated) from tblUserProperties 
    ) 
) as X  
on tblUserProperties.id=X.id  
where collector='gs'

, который дает мне набор результатов

propertyName    propertyValue
Credits             176                                               

Данные, из которых я рисую:

id  collectorId collector   propertyName    propertyValue   updated
293 183 gs                      lastName                My                                              2020-03-17 19:29:30.000
294 183 gs                      firstName               Name                                                2020-04-17 19:29:30.000
295 183 gs                      client                  0                                                   2020-03-19 19:29:30.000
296 183 gs                      notes                   TEST - Updated                                      2020-02-17 19:29:30.000
297 183 gs                      branch                  1                                                   2019-09-17 19:29:30.000
298 183 gs                      EmployeeNumber          1111                                                2020-03-17 19:29:30.000
299 183 gs                      SMSCredits              111                                                 2020-04-14 06:51:30.000
300 183 gs                      EmployeeAccess          11111                                               2020-03-17 19:29:30.000
301 183 gs                      phoneNumber             888-888-8888                                        2019-11-17 19:29:30.000
302 183 gs                      Credits                 111                                                 2020-04-14 06:51:30.000

Это данные для пользователя 'gsutton'. Другие пользователи имеют разные данные с разными датами. То, что я хочу получить, является самым последним обновлением каждого отдельного значения. К сожалению, я не знаю, как изменить свой запрос для выполнения sh этого, и мне нужна помощь SQL экспертов.

**** Обновление ****

Ожидается Вывод:

propertyName    propertyValue         updated
lastName                My            3/17/2020
firstName               Name          3/17/2020
client                  0             3/17/2020
notes                   TEST          3/17/2020
branch                  1             3/17/2020
EmployeeNumber          1111          3/17/2020
EmployeeAccess          11111         3/17/2020
phoneNumber             888-111-1111  3/17/2020
Credits                 111           4/14/2020

Обратите внимание, что теперь в столбце данных имеется только 1 столбец кредитов, один с самой последней датой, а не 2.

Ответы [ 3 ]

0 голосов
/ 14 апреля 2020

Вам необходимо дать нам структуру таблицы; образец данных; и желаемый результат.

На основании того, что я думаю, что вы хотите (не уверен, что это правильно из-за комментария выше)

select DISTINCT 
,collectorId 
,collector
,LAST_VALUE(propertyName) OVER (PARTITION BY collectorid,collector ORDER BY updated asc) as LastUpdatedPropertyName
,LAST_VALUE(propertyValue) OVER (PARTITION BY collectorid,collector ORDER BY updated asc)  as LastUpdatedPropertyValue
,LAST_VALUE(updated) OVER (PARTITION BY collectorid, collector ORDER BY updated asc)  as LastUpdatedDate
FROM YOUR_TABLE
0 голосов
/ 15 апреля 2020

Так как я получал от C#, я использовал комбинацию запросов и LiNQ, чтобы получить данные, которые я хотел. Я использовал 2 простых запроса на выборку, затем отфильтровал их с помощью LiNQ, как показано ниже.

            var query = "Select id, propertyName, propertyValue, updated " +
                "from tblUserProperties where collector='{0}'";

            query = string.Format(query, user);
            DataTable dt = DataFunctions.RunQuery(query, QUERYTYPES.SELECT, "MCAIntranet");

            query = "Select distinct propertyName " +
                "from tblUserProperties where collector='{0}'";

            query = string.Format(query, user);
            DataTable dt2 = DataFunctions.RunQuery(query, QUERYTYPES.SELECT, "dbName");


            //the SMS Credits item is added as a second row
            //so loop through all potential value rows for user
            foreach (DataRow dr in dt2.Rows)
            {
               var name = dr["propertyName"].ToString().Trim();

                try
                {
                    var tmp = (from row in dt.AsEnumerable()
                              where row.Field<string>("propertyName").Trim() == name
                              orderby row.Field<DateTime>("updated") descending
                              select row).FirstOrDefault();
    ...             

Это успешно сработало с обширным тестированием. Это не решение SQL, но оно предоставило мне необходимые данные.

0 голосов
/ 14 апреля 2020

Попробуйте следующее. Это даст вам последнее обновленное значение, где сборщик был GS.

select  
    propertyName,
    propertyValue
from
(
    select
        propertyName,
        propertyValue,
        collector,
        row_number() over (partition by propertyValue order by updated desc) as lastupdated
    from tblUserProperties
) val
where collector = 'gs'
and lastupdated = 1

Если у вас в таблице одинаковый коллектор, вам не нужно выполнять функцию partition by collectorId в row_nubmer().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...