2016-11-24 3 views
1

Мне нужно получить первый регистрационный заказ updatedtime (последний) по убыванию. Я не могу FILER верхней 1 запись из моего столаКак получить первую 1 запись каждого группового заказа по desc в SQL Server с использованием linq

select watertowerid, DOValue, PHValue, WaterTemperature, CurrentTime 
from ParkingSlots 
group by watertowerid, PHValue, DOValue, WaterTemperature, CurrentTime 

Sample данные:

PHValue DOValue WaterTemperature watertowerid CurrentTime 
--------------------------------------------------------------------------- 
3.00  4.00  22.00    1   2016-09-29 02:34:00 
6.00  4.00  33.00    2   2016-11-29 02:34:00 
8.22  6.55  28.22    1   2016-06-25 01:25:00 
30.52  5.60  27.00    2   2016-08-29 02:34:00 

Желаемая выход:

PHValue DOValue WaterTemperature watertowerid CurrentTime 
--------------------------------------------------------------------------- 
    3.00  4.00   22.00    1   2016-09-29 02:34:00 
    6.00  4.00   33.00    2   2016-11-29 02:34:00 

ответ

2

Использование СВЯЗЕЙ С

select TOP(1) with ties * 
from ParkingSlots 
order by row_number() over(partition by watertowerid order by CurrentTime DESC); 
+0

у вас есть идея, как написать этот запрос в linq – Swapna

+0

Linq не имеет прямого аналога. См. Эту тему для опций http://stackoverflow.com/questions/22157211/linq-to-entities-equivalent-of-sql-topn-with-ties – Serg

0

Используйте Row_number() функцию и найти последние строки на основе столбца CURRENTTIME стоимость.

SELECT [PHValue], [DOValue], [WaterTemperature], [watertowerid], [CurrentTime] 
    FROM (SELECT *, 
        Row_number() 
        OVER(
         partition BY [watertowerid] 
         ORDER BY currenttime DESC) rno 
      FROM ParkingSlots)a 
    WHERE rno = 1 
+0

его correct.can u помогите мне, как писать в запросе linq – Swapna

+0

@Swapna Извините, я не знаю о linq. – Buddi

0
CREATE TABLE Table2 
    (PHValue int, DOValue int, WaterTemperature int, watertowerid int, CurrentTime datetime) 
; 

INSERT INTO Table2 

VALUES 
    (3.00, 4.00, 22.00, 1, '2016-09-29 02:34:00'), 
    (6.00, 4.00, 33.00, 2, '2016-11-29 02:34:00'), 
    (8.22, 6.55, 28.22, 1, '2016-06-25 01:25:00'), 
    (30.52, 5.60, 27.00, 2, '2016-08-29 02:34:00') 
; 


;WITH cte AS 
(
    SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY watertowerid ORDER BY CurrentTime DESC) AS rn 
    FROM Table2 
) 
SELECT * 
FROM cte 
WHERE rn = 1 

SELECT * 
FROM Table2 D 
WHERE CurrentTime = (SELECT MAX(CurrentTime) FROM Table2 WHERE watertowerid = D.watertowerid) 
+0

Что такое таблица2? У меня есть только одна таблица – Swapna

+0

таблица имя .. @ Swapna – Chanukya

0

В LINQ (это предполагает, Entity Framework, другие провайдеры будут похожи):

var res = from ps in context.ParkingSlots 
      group new { ps.watertowerid, ps.PHValue, ps.DOValue, ps.WaterTemperature, ps.CurrentTime } into groups 
      from grp in groups 
      let top = (from ps in grp 
        orderby ps.updatedtime 
        select ps).FirstOrDefault() 
      where top != null 
      select top; 

должны это сделать. Второй from выполняет итерацию через группы, позволяющие упорядочивать и, следовательно, FirstOrDefault в каждой группе. Нулевая проверка не нужна (потребуется пустая группа), но с EF для Entities вы не можете использовать First во внутреннем запросе.

+0

ошибка. недопустимый термин выражения «по», а имя «g» не существует в текущем контексте. – Swapna

+0

@Swapna Typos: теперь нужно исправить (но это эскиз ответа, чтобы вы в правильном направлении не тестировали решение). – Richard

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