Получить запись с самой высокой датой из нескольких столбцов и строк с помощью запроса T-SQL или C # или Javascript / AngularJs 1 - PullRequest
0 голосов
/ 27 августа 2018

Допустим, у меня есть эта таблица MS SQL, на самом деле это результат запроса, который включает 5 таблиц:

enter image description here

ID  SOrder  Line    Date1   Date2   Date3   SomeColumn
1   123a456 10  2018-01-01  2018-01-01  2018-01-01  abc
2   123a456 10  2018-01-01  2019-01-01  2018-01-01  def
3   123a456 10  2019-01-01  2018-01-01  2020-01-01  ghi
4   123a456 10  2018-01-01  2018-01-01  2019-01-01  jkl
5   123a456 10  2018-01-01  2018-01-01  2018-01-01  mno
6   123a456 20  2018-01-01  2020-01-01  2018-01-01  prs
7   123a456 20  2019-01-01  2018-01-01  2019-01-01  tuv
8   123a456 20  2018-01-01  2018-01-01  2018-01-01  xxx
9   123a456 30  2018-01-01  2020-01-01  2018-01-01  yyy
10  123a777 10  2019-01-01  2019-01-01  2018-01-01  zzz
11  123a777 10  2020-01-01  2019-01-01  2019-01-01  111
12  123a777 20  2019-01-01  2018-01-01  2018-01-01  222
13  123a777 20  2021-01-01  2019-01-01  2019-01-01  333
14  123a777 20  2018-01-01  2018-01-01  2020-01-01  444

, где яхочу извлечь только те строки с ID = 3,6,9,11,13, которые имеют самую высокую дату.Таким образом, из первых пяти записей, у которых значение столбца Line равно 10, я хочу только строку с ID = 3, потому что она имеет самую высокую дату (2020-01-01) из 5.

1) Как я могу добиться этого с помощью запроса T-SQL?

2) В качестве альтернативы я мог бы сделать простую SELECT * FROM MyTable и выполнить вышеупомянутую фильтрацию в C # или Javascript / AngularJs 1. Но как?

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Используя приведенный ниже код, вы можете получить ответ.

CREATE TABLE #T1
(
    ID int
    ,SOrder VARCHAR(20)
    ,Line int
    ,Date1 datetime
    ,Date2 Datetime
    ,Date3 Datetime

)

;with cte as (
    SELECT ID,Line,SOrder, Date1 from #T1
    union
    SELECT ID,Line,SOrder, Date2 from #T1
    union
    SELECT ID,Line,SOrder, Date3 from #T1
)

SELECT T.* FROM #T1 T
INNER JOIN (SELECT max(Date1) as Date1,Line,SOrder FROM cte GROUP BY Line,SOrder) DT 
            ON  (DT.Date1=T.Date1 OR DT.Date1=T.Date2 OR DT.Date1=T.Date3)
            AND (DT.Line=T.Line)
            AND (DT.SOrder=T.SOrder)
0 голосов
/ 27 августа 2018

Я бы отключил даты, используя apply.

select t.*
from (select t.*,
             row_number() over (partition by SOrder, line order by dte desc) as seqnum
      from t cross apply
           (select max(v.dte) as dte
            from values (date1), (date2), (date3)
           ) v(dte)
     ) t
where seqnum = 1;

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

Если вы используете top (1) with ties, то подзапрос вам даже не нужен:

select top (1) with ties t.*
from t cross apply
     (select max(v.dte) as dte
      from values (date1), (date2), (date3)
     ) v(dte)
order by row_number() over (partition by SOrder, line order by dte desc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...