Tsql Получить новейшие записи из таблицы - PullRequest
2 голосов
/ 07 октября 2009

у меня есть эта таблица:

Location                      date                temp

1                             12-12-2009         19
1                             14-12-2009         21
1                             13-12-2009         17
2                             12-12-2009         18
2                             14-12-2009         16
2                             18-12-2009         12
2                             15-12-2009         14

Теперь я хочу выбрать самые последние (самые новые даты) строки для всех местоположений, поэтому приведите пример строки 2 и 7. Как я могу это сделать?

я могу выбрать самое последнее для 1 местоположения с первой топовой датой для одного местоположения, я попытался сгруппировать по местоположению, дате, но затем я пропустил темп ....

С уважением, Michel

Ответы [ 4 ]

10 голосов
/ 07 октября 2009

Посмотрите на это

DECLARE @Table TABLE(
        Location INT,
        Date DATETIME,
        Temp INT
)

INSERT INTO @Table (Location,Date,Temp) SELECT 1, '12 Dec 2009', 19
INSERT INTO @Table (Location,Date,Temp) SELECT 1, '14 Dec 2009', 21
INSERT INTO @Table (Location,Date,Temp) SELECT 1, '13 Dec 2009', 17

INSERT INTO @Table (Location,Date,Temp) SELECT 2, '12 Dec 2009', 18
INSERT INTO @Table (Location,Date,Temp) SELECT 2, '14 Dec 2009', 16
INSERT INTO @Table (Location,Date,Temp) SELECT 2, '18 Dec 2009', 12
INSERT INTO @Table (Location,Date,Temp) SELECT 2, '15 Dec 2009', 14


SELECT  t.*
FROM    @Table t INNER JOIN
        (
            SELECT  Location,
                    MAX(Date) MaxDate
            FROM    @Table
            GROUP BY Location
        ) MaxDates ON t.Location = MaxDates.Location
                    AND t.Date = MaxDates.MaxDate
ORDER BY 1

Единственное, на что вы можете обратить внимание, это когда maxdat для данного местоположения может встречаться более одного раза, объединение вернет более одного результата для местоположения, комбинации дат.

Вы можете решить, как выбрать, какой из этих результатов или все, что вы хотите вернуть.

3 голосов
/ 07 октября 2009

Это:

SELECT  *
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY Location ORDER BY Date DESC) AS rn
        FROM    mytable
        ) a
WHERE   a.rn = 1

или это:

WITH    Locations AS
        (
        SELECT  DISTINCT Location
        FROM    mytable
        )
SELECT  last.*
FROM    Locations
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    mytable
        WHERE   mytable.Location = Locations.Location
        ORDER BY
                mydate DESC
        ) last

Первый более эффективен, если у вас нет индекса на (Location, Date), второй более эффективен, если у вас есть.

1 голос
/ 07 октября 2009

Попробуйте что-то вроде:

SELECT y.location, y.date, y.temp FROM yourTable y
INNER JOIN (
    SELECT location, MAX(date) AS latestDate
    FROM yourTable
    GROUP BY location
) tmp ON y.location = tmp.location AND y.date = tmp.latestDate
ORDER BY y.location

N.B. Это предполагает, что каждая дата записывается только один раз для каждого местоположения.

Чтобы понять, как получить это, помните, что вы имеете дело с сетами, поэтому начните с простого бита:

SELECT location, MAX(date)
FROM yourTable
GROUP BY location

Это дает вам самую последнюю дату для каждого местоположения. Затем вы хотите извлечь температуру для каждого кортежа в этом наборе. Вы делаете это, комбинируя свои исходные данные и отключая каждый кортеж местоположения / даты. В SQL это JOIN для двух столбцов.

0 голосов
/ 07 октября 2009

Как насчет выбора самой новой даты в подобъекте, подобного этому:

select * from t where date = (select max(date) from t);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...