Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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_Sql Server - Fatal编程技术网

Sql 基于特定条件的行数

Sql 基于特定条件的行数,sql,sql-server,Sql,Sql Server,我有一个按sessionid和时间戳ts排序的表 我想找到的是,在同一个会话sessionid中,在购物车页面视图屏幕\u name='checkout\u cart'之后至少有一个listpage视图屏幕\u name='listpage'的sessionid的计数 表: sessionid screen_name ts 11 checkout_cart 1593 11 checkout_cart 1594 12 checkout_cart 1890 12 home_page 1892 12

我有一个按sessionid和时间戳ts排序的表

我想找到的是,在同一个会话sessionid中,在购物车页面视图屏幕\u name='checkout\u cart'之后至少有一个listpage视图屏幕\u name='listpage'的sessionid的计数

表:

sessionid screen_name ts

11 checkout_cart 1593
11 checkout_cart 1594
12 checkout_cart 1890
12 home_page 1892
12 list_page 1894
12 checkout_cart 1896
13 list_page 1900
13 checkout_cart 1902
13 home_page 1904
14 checkout_cart 1990
14 home_page 1992
14 list_page 1994
14 checkout_cart 1996
根据表格,我的计数应该是2会话id 12和14,13不能计数,因为列表页面在购物车页面之前
请帮我写一个关于这个的查询,我被逻辑卡住了。

试试这个版本:

select t.sessionid,count(*)
from your_table t
where screen_name='listpage'
and exists
(
    select 1
    from your_table t2
    where t2.screen_name='checkout_cart'
    and t2.ts<t.ts and t.sessionid=t2.sessionid
)
group by t.sessionid

编辑:添加了sessionid加入条件,最初错过了该条件

请尝试此现有版本:

select t.sessionid,count(*)
from your_table t
where screen_name='listpage'
and exists
(
    select 1
    from your_table t2
    where t2.screen_name='checkout_cart'
    and t2.ts<t.ts and t.sessionid=t2.sessionid
)
group by t.sessionid

编辑:添加了sessionid连接条件,错过了最初一个使用聚合的方法。要获取会话列表,请执行以下操作:

select sessionid
from t
where screen_name in ('listpage', 'checkout_cart')  -- only needed for performance
group by sessionid
having max(case when screen_name = 'listpage' then ts end) > min(case when screen_name = 'checkout_cart' then ts end)
要获取计数,请使用子查询或CTE:

select count(*)
from (select sessionid
      from t
      where screen_name in ('listpage', 'checkout_cart')  -- only needed for performance
      group by sessionid
      having max(case when screen_name = 'listpage' then ts end) > min(case when screen_name = 'checkout_cart' then ts end)
     ) t

一种方法使用聚合。要获取会话列表,请执行以下操作:

select sessionid
from t
where screen_name in ('listpage', 'checkout_cart')  -- only needed for performance
group by sessionid
having max(case when screen_name = 'listpage' then ts end) > min(case when screen_name = 'checkout_cart' then ts end)
要获取计数,请使用子查询或CTE:

select count(*)
from (select sessionid
      from t
      where screen_name in ('listpage', 'checkout_cart')  -- only needed for performance
      group by sessionid
      having max(case when screen_name = 'listpage' then ts end) > min(case when screen_name = 'checkout_cart' then ts end)
     ) t
。。。有了它,您也不需要执行子查询。它是一个带有case语句的简单聚合


。。。有了它,您也不需要执行子查询。这是一个带有case语句的简单聚合。

或多或少,这个查询是可以的。或多或少,这个查询是可以的。谢谢它工作了,而不是我用min的max签出购物车。谢谢它工作了,而不是我用min的max签出购物车。