выбирая самую последнюю запись - PullRequest
6 голосов
/ 08 июля 2011

Как выбрать самые последние записи, если записи имеют почти одинаковый тип данных ...

пример:

col1       col2          col3              col4
--------------------------------------------------
123         abc          1.1               12345
123         abc          1.1               123445
1234        dsv          2.0               123
1234        dsv          2.0               1233
12345       dsvw         1.2               1234

Максимум col4 при сравнении с остальнымистолбцов.

См. данные row1 и row2 выглядят одинаково, но нам нужны последние данные, основанные на col4.

То же самое с row3 и row4, данные выглядят аналогично, но нам нужны последние данныена основе col4.

И требуемый вывод:

col1    col2   col3   col4
----------------------------
123     abc    1.1    123445
1234    dsv    2.0    1233
12345   dsvw   1.2    1234 

Ответы [ 4 ]

5 голосов
/ 08 июля 2011

Я предполагаю, что "последний" означает "самый большой"?

DECLARE @t TABLE
(
    col1 INT, 
    col2 CHAR(3), 
    col3 DECIMAL(4,1), 
    col4 INT
);

INSERT @t SELECT 123, 'abc', 1.1, 12345
UNION SELECT 123, 'abc', 1.1, 123445
UNION SELECT 1234, 'dsv', 2.0, 123
UNION SELECT 1234, 'dsv', 2.0, 1233;

WITH t AS
(
    SELECT col1, col2, col3, col4,
        rn = ROW_NUMBER() OVER
            (PARTITION BY col1 ORDER BY col4 DESC)
        FROM @t
)
SELECT col1, col2, col3, col4
    FROM t
    WHERE rn = 1;
3 голосов
/ 08 июля 2011

Использование:

WITH example AS (
   SELECT t.*,
          ROW_NUMBER() OVER (PARTITION BY t.col1
                                 ORDER BY t.col4 DESC) AS rnk
     FROM YOUR_TABLE t)
SELECT e.*
  FROM example e
 WHERE e.rnk = 1

.. или:

SELECT e.*
  FROM (SELECT t.*,
               ROW_NUMBER() OVER (PARTITION BY t.col1
                                      ORDER BY t.col4 DESC) AS rnk
          FROM YOUR_TABLE t) e
 WHERE e.rnk = 1

CTE не обеспечивает никакой оптимизации по сравнению с подходом на основе производной таблицы.

0 голосов
/ 08 июля 2011

Мне кажется, что я что-то упускаю из-за всех других ответов, но мне кажется, что это просто MAX/group by:

with temp as
(
select 123 as col1,'abc' as col2, '1.1' as col3, 12345 as col4
UNION
select 123, 'abc', '1.1'  ,123445
UNION
select 1234,'dsv','2.0' ,123
UNION
select 1234,'dsv' ,'2.0'  ,1233

)

SELECT col1, Col2, COl3, MAX(Col4)
FROM temp
GROUP BY col1, col2,col3

Это вернет желаемые результаты

0 голосов
/ 08 июля 2011

Это делает то, что вы хотите:

select * from table t
where col4 = (select max(col4) from table where col1 = t.col1);

Вы можете добавлять другие тесты в тест по мере необходимости (не ясно из вопроса, если это требуется), например:

select * from table t
where col4 = (select max(col4) from table
              where col1 = t.col1 and col2 = t.col2 and col3 = t.col3);

Примечание: это вернет несколько строк, если есть несколько записей, которые имеют одинаковое максимальное значение для col4.Это может не быть проблемой, или вы можете использовать DISTINCT или другое лечение по мере необходимости.

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