Как выбрать только самую последнюю дату с определенным условием данных столбца - PullRequest
2 голосов
/ 29 апреля 2019

У меня есть таблица с несколькими строками данных, мне нужно выбрать только самую последнюю дату для каждой модели группы, в которую включены столбцы «ПОКУПАТЬ» и «A / R», за исключением «CONSIGN» и «N / A».Например: я хочу выбрать только последнюю строку, в которой catm равен 'BUY' / 'A / R'.

id      partno       model       catm         date
1.      001          TOYOTA       CONSIGN     2010
2.      001          HONDA        CONSIGN     2009
3.      001          HONDA        BUY         2015
4.      001          TESLA        CONSIGN     2018
5.      001          TESLA        CONSIGN     2018


SELECT partno,max(date) as maxdate
FROM [mytable]
WHERE partno='001'
GROUP BY model
ORDER BY maxdate DESC 

id partno модель catm дата

пусто пусто пусто пустопусто

Выше приведен ожидаемый результат того, что я хочу.Поскольку последняя дата catm - «CONSIGN», она ничего не покажет.Но фактический результат покажет мне это ..

id      partno       model       catm         date
1.      001          HONDA        BUY         2015

Ответы [ 3 ]

0 голосов
/ 29 апреля 2019

Вы можете делать что хотите, используя оконные функции:

select t.*
from (select t.*, max(t.date) over (partition by t.model) as max_date
      from mytable t
     ) t
where t.partno = '001' and
      t.catm in ('Buy', 'A/R') and
      t.date = t.max_date;
0 голосов
/ 30 апреля 2019

Вы можете использовать общее табличное выражение и функцию ROW_NUMBER, чтобы проверить это, в этом я упорядочиваю набор данных по дате desc и ставлю номер строки напротив каждого, так что RN = 1 всегда самая последняя запись, после чего в выборке вы можете поместить любую вещь в предложение where по вашему желанию.

WITH T AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY partno ORDER BY date DESC) AS RN,*
FROM MY_TABLE
)

SELECT * FROM T WHERE
RN=1 and
catm IN('Buy', 'A/R')
0 голосов
/ 29 апреля 2019

Попробуйте следующее:

            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(string));
            dt.Columns.Add("partno", typeof(string));
            dt.Columns.Add("model", typeof(string));
            dt.Columns.Add("catm", typeof(string));
            dt.Columns.Add("date", typeof(int));

            dt.Rows.Add(new object[] {"1.", "001", "TOYOTA", "CONSIGN", 2010});
            dt.Rows.Add(new object[] {"2.", "001", "HONDA", "CONSIGN", 2009});
            dt.Rows.Add(new object[] {"3.", "001", "HONDA", "BUY", 2015});
            dt.Rows.Add(new object[] {"4.", "001", "TESLA", "CONSIGN", 2018});
            dt.Rows.Add(new object[] {"5.", "001", "TESLA", "CONSIGN", 2018});

            List<DataRow> latest = dt.AsEnumerable()
                .OrderByDescending(x => x.Field<int>("date"))
                .Where(x => x.Field<string>("catm") == "BUY" || x.Field<string>("catm") == "A/R")
                .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...