选择带有where子句和最近日期的不重复

时间:2019-04-10 20:32:03

标签: sql sql-server

我有一张表,仅需要查找不同的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 个答案:

答案 0 :(得分:1)

您可以使用row_number()为每一行分配一个数字,该数字是所有date中最大的arm的1,然后对其进行过滤。

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;

答案 1 :(得分:1)

尝试一下:

select top 1 arm, stk
from mov
where stk > 1
group by arm,STK
order by max(date) desc

答案 2 :(得分:0)

我不确定您是否要使用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;

这两个都返回您指定的一行。

in this CodePen是一个db <>小提琴,表明它确实满足您在问题中指定的内容(嗯,它返回整行,而不仅仅是两列)。

答案 3 :(得分:0)

您可以使用此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

但是请注意,如果多个记录具有相同的DATE,则会返回多行。

答案 4 :(得分:0)

您可以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

请参见demo
结果:

> arm | stk
> :-- | --:
> F4  | 100