2009-10-07 4 views
2

У меня есть эта таблица:Tsql Получить новые записи из таблицы

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 место с верхней 1 дня для одного рабочего места, я попытался сгруппировать по местоположению, дате, но тогда я скучаю темп ....

С наилучшими пожеланиями, Michel

+0

Возможно, вы захотите отметить этот вопрос «sql», потому что вам не нужны специальные функции T-SQL. Кроме того, вы должны изменить имя столбца «дата» на что-то другое, так как это зарезервированное слово в SQL. Он работает, но может дать вам трудное время. –

+0

, но затем я также получаю ответы, например, на конкретный MySql sql – Michel

ответ

10

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

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 для данного местоположения может быть более одного раза, соединение вернет более одного результата для местоположения, комбинации даты.

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

0

насчет выбора новейшую дату в подзапрос, как это:

select * from t where date = (select max(date) from t); 
+0

. Это приведет только к возврату строк со значением даты высоты, может быть подмножеством требуемых строк, одной строки или нескольких строк с одинаковым местоположением ... –

+0

О, я вижу, у меня вопрос неправильный ... –

1

Try что-то вроде:

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 

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

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

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

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

3

Это:

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), последний является более эффективным, если вы делаете.

Смежные вопросы