Получить минимальную дату и время от группы по - PullRequest
0 голосов
/ 27 июня 2018

У меня следующий запрос

SELECT tag, time, value FROM picomp
WHERE tag = test.PV' AND time >= '6/19/2017'

Результат:

test.PV,6/25/2017 12:10:59 AM,23.9164886
test.PV,6/25/2017 12:11:59 AM,23.8978481
test.PV,6/25/2017 12:12:59 AM,23.888525
test.PV,6/25/2017 12:14:00 AM,23.8698845
test.PV,6/25/2017 12:15:00 AM,23.8605652
test.PV,6/25/2017 12:16:00 AM,23.8512459
test.PV,6/25/2017 12:17:00 AM,23.8326035
test.PV,6/25/2017 12:18:00 AM,23.8139629
test.PV,6/25/2017 12:19:00 AM,23.7953224
test.PV,6/25/2017 12:20:00 AM,23.77668
test.PV,6/25/2017 12:21:00 AM,23.7673588
test.PV,6/25/2017 12:22:00 AM,23.7487202
test.PV,6/25/2017 12:23:00 AM,23.7300777
test.PV,6/25/2017 12:24:00 AM,23.7207565
test.PV,6/25/2017 12:25:00 AM,23.7114372
test.PV,6/25/2017 12:26:00 AM,23.6927948
test.PV,6/25/2017 12:27:00 AM,23.6741543
test.PV,6/25/2017 12:28:00 AM,23.6648331
test.PV,6/25/2017 12:29:00 AM,23.6461945
test.PV,6/25/2017 12:29:59 AM,23.6368713
test.PV,6/25/2017 12:30:59 AM,23.6182308

Мне нужно округлить его, как показано ниже:

test.PV,6/25/2017 12:10:59 AM,23.9
test.PV,6/25/2017 12:11:59 AM,23.9
test.PV,6/25/2017 12:12:59 AM,23.9
test.PV,6/25/2017 12:14:00 AM,23.9
test.PV,6/25/2017 12:15:00 AM,23.9
test.PV,6/25/2017 12:16:00 AM,23.8
test.PV,6/25/2017 12:17:00 AM,23.8

и выберите только первую строку дублированного значения

test.PV,6/25/2017 12:10:59 AM,23.9
test.PV,6/25/2017 12:16:00 AM,23.8

Я мог бы использовать раунд с MIN (time) OVER (PARTITION BY tag), но мне нужна группировка по.

спасибо, S

Ответы [ 3 ]

0 голосов
/ 27 июня 2018
-- Q: I need to round it, like below:
-- A: Convert the value to decimal(3,1) for example
select convert(decimal(3,1), 23.6182308)

-- Q: and select only first row of duplicated value
-- A option 1:
-- you can use ROW_Number function (supported even in sql server 2008)
-- with partition by all the duplicates columns. 
-- Next you simply filter (using where) the rows with ROW_NUMBER column = 1
-- A option 2: Use DISTINCT in the SELECT

** Примечание! Если вы не знаете, как реализовать то, что я написал, то, пожалуйста, опубликуйте DDL + DML (запрос для создания таблицы и вставки некоторых образцов данных для игры), и я дам вам точный запрос

--- обновление: добавить точный пример на основе DDL + DML, отправленный DhruvJoshi ----

Пожалуйста, отметьте эту опцию:

;With MyCTE as (
    select
        tag, 
        time, 
        convert(decimal(3,1), [value]) as [value],
        RN = ROW_NUMBER() 
            OVER (partition by tag, convert(decimal(3,1), [value]) order by [time])
    from picomp
)
select tag, [time], [value]
from MyCTE
where RN = 1
GO

и DDL + DML, который я использовал, взят из ответа DhruvJoshi:

create table picomp (tag varchar(10), [time] datetime, [value] decimal(18,8));
insert into picomp values
 ('test.PV','6/25/2017 12:10:59 AM',23.9164886)
,('test.PV','6/25/2017 12:11:59 AM',23.8978481)
,('test.PV','6/25/2017 12:12:59 AM',23.888525)
,('test.PV','6/25/2017 12:14:00 AM',23.8698845)
,('test.PV','6/25/2017 12:15:00 AM',23.8605652)
,('test.PV','6/25/2017 12:16:00 AM',23.8512459)
,('test.PV','6/25/2017 12:17:00 AM',23.8326035)
,('test.PV','6/25/2017 12:18:00 AM',23.8139629)
,('test.PV','6/25/2017 12:19:00 AM',23.7953224)
,('test.PV','6/25/2017 12:20:00 AM',23.77668)
,('test.PV','6/25/2017 12:21:00 AM',23.7673588)
,('test.PV','6/25/2017 12:22:00 AM',23.7487202)
,('test.PV','6/25/2017 12:23:00 AM',23.7300777)
,('test.PV','6/25/2017 12:24:00 AM',23.7207565)
,('test.PV','6/25/2017 12:25:00 AM',23.7114372)
,('test.PV','6/25/2017 12:26:00 AM',23.6927948)
,('test.PV','6/25/2017 12:27:00 AM',23.6741543)
,('test.PV','6/25/2017 12:28:00 AM',23.6648331)
,('test.PV','6/25/2017 12:29:00 AM',23.6461945)
,('test.PV','6/25/2017 12:29:59 AM',23.6368713)
,('test.PV','6/25/2017 12:30:59 AM',23.6182308);
GO
select * from picomp
GO
0 голосов
/ 27 июня 2018

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

select tag, time=min(time), value=min(value)
from (
    SELECT tag, [time], value= cast(value  as decimal(18,1)),
    r=row_number() over( partition by tag order by time asc, cast(value  as decimal(18,1)) asc),
    r2=row_number() over(partition by tag order by cast(value  as decimal(18,1)) asc)
FROM picomp
WHERE tag = 'test.PV' AND [time] >= '6/19/2017'
    )t
group by tag, r-r2
0 голосов
/ 27 июня 2018

Хммм. Это то, что вы хотите?

select tag, time, cast(round(value, 1) as decimal(5, 1))
from (select tag, time, value,
             lag(value) over (partition by tag order by time) as prev_value
      from picomp 
      where tag = test.PV' and time >= '2017-06-19'
     ) p
where round(value, 1) <> round(prev_value, 1) or
      prev_value is null;
...