Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL选择可见类别中的最新条目_Sql - Fatal编程技术网

SQL选择可见类别中的最新条目

SQL选择可见类别中的最新条目,sql,Sql,我有一个sql表: DATE USER FLAGGED COMMAND 1 Alice 0 sudo gparted 2 Bob 1 sudo 3 Bob 0 mv 4 Alice 1 sudo rm -rf 5 Charlie 1 sudo chown 我想选择用户最后标记的

我有一个sql表:

DATE  USER     FLAGGED    COMMAND   
1     Alice    0          sudo gparted   
2     Bob      1          sudo   
3     Bob      0          mv   
4     Alice    1          sudo rm -rf    
5     Charlie  1          sudo chown    
我想选择用户最后标记的操作

DATE  USER     FLAGGED    COMMAND    
2     Bob      1          sudo    
4     Alice    1          sudo rm -rf   
5     Charlie  1          sudo chown   
我试过了

select DATE, USER, REQUEST
from
(

select DATE, USER, REQUEST, FLAGGED
row_number() over(partition by USER order by date desc) rn
from USERDATA
) src
where rn = 1 and FLAGGED = 1

但它忽略了鲍勃。如何将“标记的=1”添加到SQL请求中?正确的方法是什么?

将标记的条件移动到子查询,以便只检索标记为=1的行,并且您可以选择具有rn=1条件的最新行

select DATE, USER, REQUEST
from
(
select DATE, USER, REQUEST, FLAGGED,
row_number() over(partition by USER order by date desc) rn
from USERDATA
where flagged = 1
) src
where rn = 1

将带标记的条件移动到子查询,这样只会检索带标记=1的行,并且您可以选择带rn=1条件的最新行

select DATE, USER, REQUEST
from
(
select DATE, USER, REQUEST, FLAGGED,
row_number() over(partition by USER order by date desc) rn
from USERDATA
where flagged = 1
) src
where rn = 1

在这里,您首先为用户选择最新的条目,然后删除未标记的条目。相反,您应该首先选择所有标记的条目,然后查找其中最新的条目。这个代码应该可以工作

 select DATE, USER, REQUEST
 from
  (
    select DATE, USER, REQUEST, FLAGGED 
   row_number() over(partition by USER order by DATE desc) rn
    from USERDATA WHERE FLAGGED = 1  
  ) src
 where rn = 1

在这里,您首先为用户选择最新的条目,然后删除未标记的条目。相反,您应该首先选择所有标记的条目,然后查找其中最新的条目。这个代码应该可以工作

 select DATE, USER, REQUEST
 from
  (
    select DATE, USER, REQUEST, FLAGGED 
   row_number() over(partition by USER order by DATE desc) rn
    from USERDATA WHERE FLAGGED = 1  
  ) src
 where rn = 1

您还可以使用通用的
MAX
查询:

select DATE, USER, REQUEST
from USERDATA
WHERE (date, user) IN (
  select MAX(DATE) as date, USER
  from USERDATA
  where flagged = 1
  group by user
) 
AND flagged = 1

但是,请注意,如果有两个用户条目的最大日期相同,则可能返回重复的。。。您可以通过在外部选择上使用最小值或最大值来避免这种情况。

您也可以使用通用的
MAX
查询:

select DATE, USER, REQUEST
from USERDATA
WHERE (date, user) IN (
  select MAX(DATE) as date, USER
  from USERDATA
  where flagged = 1
  group by user
) 
AND flagged = 1

但是,请注意,如果有两个用户条目的最大日期相同,则可能返回重复的。。。您可以通过在外部选择上使用最小值或最大值来避免这种情况。

它忽略了Bob,因为标记为1的行是该用户按日期描述订购的第二行。
(按用户按日期描述订购的分区,标记为desc)rn
它忽略了Bob,因为标记为1的行是该用户按日期描述订购的第二行。
(按用户订单按日期描述划分,标记描述)rn