Выберите отдельно с предложением где и самой последней датой - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть таблица, в которой мне нужно найти только различные значения полей ARM и STK соответственно, где DATE - самое последнее, а STK - больше 1. То есть, если последний отрицательный результат я больше не хочу, чтобы вы показывали.

Таблица выглядит следующим образом:

Table MOV         

   Id       ARM   STK       DATE             
b3c842e3    F4    230   23-03-2019 00:00:00
b3c842e4    P8    832   24-03-2019 00:00:00
b32d4211    F4    -30   21-03-2019 00:00:00
6hhd421q    F4    100   26-03-2019 00:00:00
kih3221a    P8    -12   25-03-2019 00:00:00

Результат, который я хочу получить:

ARM   STK
F4    100

Я пытался использовать SELECT DISTINCT, но я не мог сделать то, что хотел, из-за WHERE.

Ответы [ 5 ]

1 голос
/ 10 апреля 2019

Попробуйте это:

select top 1 arm, stk
from mov
where stk > 1
group by arm,STK
order by max(date) desc
1 голос
/ 10 апреля 2019

Вы можете использовать row_number() для присвоения каждой строке числа, равного 1, для наибольшего date для всех arm каждого и фильтрации по нему.

SELECT x.id,
       x.arm,
       x.stk,
       x.date
       FROM (SELECT t.id,
                    t.arm,
                    t.stk,
                    t.date,
                    row_number() OVER (PARTITION BY arm
                                       ORDER BY date DESC)
                    FROM elbal t
                    WHERE t.stk > 1) x
       WHERE x.rn = 1;
0 голосов
/ 10 апреля 2019

Вы можете group by arm получить все максимальные даты для каждого arm, затем присоединиться к таблице mov и отклонить все строки, для которых условие stk > 1 не применяется.

select 
  m.arm, m.stk 
from mov m inner join (
  select arm, max(date) date
  from mov
  group by arm
) g on g.arm = m.arm and g.date = m.date
where m.stk > 1

См. Демоверсию .Результаты:

> arm | stk
> :-- | --:
> F4  | 100
0 голосов
/ 10 апреля 2019

Вы можете использовать этот SQL для получения желаемого результата.

select t1.ARM,t1.STK from MOV t1
join (select Date=MAX(DATE) from MOV where STK > 1) T2 on t1.Date = T2.Date

, но имейте в виду, что если несколько записей имеют одинаковую дату, будет возвращено несколько строк.

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

Я не уверен, хотите ли вы самое последнее значение с stk > 1:

select top (1) m.*
from mov m
where m.stk > 1
order by m.date desc;

Или, если вы хотите строки, где самое последнее значение для ARM имеет stk > 1. Если это то, что вы хотите, то:

select m.*
from (select m.*,
             row_number() over (partition by arm order by date desc) as seqnum
      from mov m
     ) m
where seqnum = 1 and m.stk > 1
order by m.date desc;

Оба они возвращают указанную вами строку.

Здесь - это db <> скрипка, показывающая, что это именно то, что вы указали в вопросе (ну, он возвращает всю строку, а не только два столбца).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...