2016-12-11 2 views
0

У меня есть вопрос для SQL Group By ЗаявлениеSQL Group By Заявление

Первый Это мой стол -> temp_data

id | a_id  |  date_time   | length | <br> 
1074 | 3 | 2016-12-07 09:13:13.490 | 1.036013 | <br> 
1075 | 1 | 2016-12-07 09:13:13.690 | 1.699601 | <br> 
1076 | 0 | 2016-12-07 09:13:13.867 | 2.110443 | <br> 
1077 | 3 | 2016-12-07 09:13:14.490 | 1.027660 | <br> 
1078 | 1 | 2016-12-07 09:13:14.690 | 1.742645 | <br> 
1079 | 0 | 2016-12-07 09:13:14.867 | 2.121963 | <br> 
1080 | 2 | 2016-12-07 09:13:18.390 | 4.008482 | <br> 

Я пытаюсь выберите Ид, a_id, дата_время, длина для 3-х различных порядка a_id по идентификатору возрастанию поэтому я использую этот

SELECT DISTINCT 
    a_id, 
    Min(id) id,   
    Min(Last_Data.lenght) lenght, 
    (Select date_time from temp_data 
    where temp_data.id = Min(Last_Data.id)) last_time 
FROM (
    SELECT * 
    FROM temp_data 
    where id >= 1074 and id <= 1080 
) Last_Data 
GROUP BY a_id 
order by id asc 

в результате

id | a_id  |  last_time   | length | <br> 
1074 | 3 | 2016-12-07 09:13:13.490 | 1.013928 | <br> 
1075 | 1 | 2016-12-07 09:13:13.690 | 1.699601 | <br> 
1076 | 0 | 2016-12-07 09:13:13.867 | 2.110443 | <br> 

Я получаю неправильное значение длины для id. Как я могу решить эту проблему?

P.S. : Сначала я получаю 3 разных a_id в этой таблице. Затем я использую select top 3 * statement. Потому что два одинаковых a_id могут поступать последовательно. Например

id | a_id  |  date_time   | length | <br> 
1074 | 1 | 2016-12-07 09:13:13.490 | 1.013928 | <br> 
1075 | 1 | 2016-12-07 09:13:13.690 | 1.699601 | <br> 
+0

выбирает Ваш запрос 'last_time', но нет такого столбца в указанном результате ... Также другой порядок столбцов. – jarlh

+0

@jarih Я исправлю это – BK52

+0

, с какими RDMS вы используете? Ответ может зависеть от этого. – trincot

ответ

0

Вы можете использовать аналитическую функцию first_value с over пунктом:

select a_id, 
     min(id) id,   
     first_value(length) over (partition by a_id order by id) length, 
     first_value(date_time) over (partition by a_id order by id) last_time 
where id >= 1074 and id <= 1080 
group by a_id 
order by 2 asc 
0
;with cteData as 
( 
    SELECT 
     t.a_id, t.id, t.date_time, t.lenght, 
     row_number() over(partition by t.a_id order by t.date_time desc) rn 
    FROM temp_data t 
    where id >= 1074 and id <= 1080 
) 
select 
    d.a_id, d.id, d.date_time as last_date_time, t.length 
from cteData d 
where d.rn = 1