如何在sql server中根据列和最新状态显示计数

23c0lvtd  于 2021-07-27  发布在  Java
关注(0)|答案(2)|浏览(191)

我有一张这样的table

ID | name    | status |   Year
_______________________________________ 
    1  |f1 car  | enter    |2017
    2  |f2 car  | checking |2019
    3  |f3 car  | enter    |2017
    4  |f2 car  | enter    |2018
    5  |f3 car  | checking |2019
    6  |f2 car  | exit     |2020
    7  |f3 car  | exit     |2020
    8  |f1 car  | checking |2018
    9  |f4 car  | enter    |2019
   10  |f5 car  |enter     |2019
   11  |f4 car  |checking  |2020

有三件事 name , status and year 我想让它得到最新的地位明智的计数根据年份和汽车计数 'enter' 每辆车的第一个状态是指如果表中有一辆车,第一个状态将是 enter 然后检查然后
像这样我想得到的查询后

enter | checking | exit
_______________________
 1    |2         | 2

这是最近一年明智的汽车计数状态
如何在sql中实现这一点
我的解决办法是首先我得到的汽车清单,其中有 status 'enter' 现在我有5辆车的名字,我放在一个 temp table 现在我将重复 temp table 并按名称在订单表中搜索根据年份选择最后状态并将其放入表中
然后,在temp表的第二行,我将选择一个car名称并遍历order表,得到第二行car的最后一个状态
请告诉我还能做什么

fcy6dtqo

fcy6dtqo1#

你可以用 row_number() 和聚合。如果您满足于将结果放在单独的行而不是列中,那么这很简单:

select status, count(*)
from (select t.*,
             row_number() over (partition by name order by year desc) as seqnum
      from orders t
     ) t
where seqnum = 1
group by status;
h4cxqtbf

h4cxqtbf2#

查询可能如下所示:

SELECT DISTINCT
       name,
       FIRST_VALUE(ID) OVER (PARTITION BY name ORDER BY Year ASC, ID ASC) first_row,
       COUNT(ID) OVER (PARTITION BY name) total_rows_count,
       MIN(CASE WHEN status = 'enter' THEN Year END) OVER (PARTITION BY name) entering_year,
       SUM(CASE WHEN status = 'checking' THEN 1 END) OVER (PARTITION BY name) checkings_count,
       MAX(CASE WHEN status = 'exit' THEN Year END) OVER (PARTITION BY name) exit_year
FROM cars;

您可以通过创建相应的参数表达式和窗口定义来添加任何其他列。
或者你需要一个简单的

WITH
cte AS ( SELECT DISTINCT name,
                         FIRST_VALUE(status) OVER (PARTITION BY name ORDER BY Year DESC, ID DESC) status
         FROM cars )
SELECT SUM(CASE WHEN status = 'enter' THEN 1 ELSE 0 END) enter,
       SUM(CASE WHEN status = 'checking' THEN 1 ELSE 0 END) checking,
       SUM(CASE WHEN status = 'exit' THEN 1 ELSE 0 END) [exit]
FROM cte

?
小提琴

相关问题