Как получить последнюю запись для каждого имени пользователя - PullRequest
0 голосов
/ 10 октября 2018

У меня есть запись, как показано ниже

item  | group  | score | updatedate |
------+--------+-------+------------+
item0 | group0 | 900   | 2018-01-01 |
item1 | group0 | 1000  | 2018-01-05 |
item1 | group1 | 1110  | 2018-01-01 |
item2 | group0 | 850   | 2018-01-01 |
item2 | group1 | 755   | 2018-01-02 |
item2 | group2 | 985   | 2018-01-03 |

как получить только 1 запись на элемент только с последним обновлением?запись должна выглядеть так:

item  | group  | score | updatedate |
------+--------+-------+------------+
item0 | group0 | 900   | 2018-01-01 |
item1 | group0 | 1000  | 2018-01-05 |
item2 | group2 | 985   | 2018-01-03 |

это SQL Server 2012, я пробовал с этим запросом

SELECT a.item, a.updateddate, a.score
FROM pricelist a
LEFT OUTER JOIN pricelist b ON a.item = b.item AND a.UpdateDate < b.updateddate
WHERE b.item IS NULL
ORDER BY a.item desc;

, но все еще показываю повторяющийся элемент

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Ниже Query поможет вам.

SELECT 
    T.item
    ,T.[group]
    ,T.score
    ,T.updateddate
FROM 
#ItemTbl T 
inner join 
(
select 
    item
    ,MAX(updateddate) updateddate
FROM #ItemTbl
group by 
    item) T2 ON T.item=T2.item and t.updateddate=t2.updateddate
0 голосов
/ 10 октября 2018

Несколько ответов на этот.Одним из них является использование TOP 1 WITH TIES:

SELECT TOP 1 WITH TIES
       item,
       [group],
       score,
       updatedate
FROM YourTable
ORDER BY ROW_NUMBER() OVER (PARTITION BY item ORDER BY updatedate DESC);

В противном случае вы можете использовать CTE:

WITH CTE AS(
    SELECT item,
           [group],
           score,
           updatedate,
           ROW_NUMBER() OVER (PARTITION BY item ORDER BY updatedate DESC) AS RN
    FROM YourTable)
SELECT item,
       [group],
       score,
       updatedate
FROM CTE
WHERE RN = 1
0 голосов
/ 10 октября 2018

Мы можем попробовать использовать ROW_NUMBER здесь:

SELECT item, [group], score, updatedate
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY item ORDER BY updatedate DESC) rn
    FROM yourTable
) t
WHERE rn = 1
ORDER BY item;

Примечания: Не называйте ваши столбцы (или таблицы и т. Д.), Используя зарезервированные ключевые слова SQL, такие как GROUP,Мне пришлось покинуть ваш столбец [group], чтобы запрос работал.Кроме того, если у вас может быть один элемент с более чем одной записью, связанной с самой последней updatedate, и вы хотите включить все связи, то мы можем попробовать заменить ROW_NUMBER на RANK или DENSE_RANK.

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