Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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
Mysql 基于出现次数的选择,不使用分组依据_Mysql_Sql_Sql Server - Fatal编程技术网

Mysql 基于出现次数的选择,不使用分组依据

Mysql 基于出现次数的选择,不使用分组依据,mysql,sql,sql-server,Mysql,Sql,Sql Server,假设我有一个数据库表,其中每行包含有关计算机硬件购买的信息,如下所示: | clientID | typeOfDevice | transactionDate | typeOfDevice包含一个字符串,其中包含客户购买的设备类型 使用SQL,我如何找到每一位购买笔记本电脑至少2次,最多1台的客户,而不使用GROUP BY?使用窗口功能的SQL Server解决方案: WITH cte AS ( SELECT DISTINCT clientId ,COUNT(CASE WHEN ty

假设我有一个数据库表,其中每行包含有关计算机硬件购买的信息,如下所示:

| clientID | typeOfDevice | transactionDate |
typeOfDevice包含一个字符串,其中包含客户购买的设备类型

使用SQL,我如何找到每一位购买笔记本电脑至少2次,最多1台的客户,而不使用GROUP BY?

使用窗口功能的SQL Server解决方案:

WITH cte AS
(
  SELECT DISTINCT clientId
   ,COUNT(CASE WHEN typeOfDevice = 'laptop' THEN 1 END) 
      OVER (PARTITION BY clientId) AS laptop
   ,COUNT(CASE WHEN typeOfDevice = 'PC' THEN 1 END) 
      OVER (PARTITION BY clientId) AS PC
  FROM table_name
)
SELECT *
FROM cte
WHERE laptop >= 2 AND PC <=1;

在MySQL中,您可以使用相关子查询来完成此操作:

SELECT clientID
FROM (
  SELECT DISTINCT clientID,
         (SELECT COUNT(*) 
          FROM mytable AS t2
          WHERE t1.clientID = t2.clientID AND
                typeOfDevice = 'Laptop') AS laptops,
         (SELECT COUNT(*) 
          FROM mytable AS t2
          WHERE t1.clientID = t2.clientID AND
                typeOfDevice = 'PC') AS pcs              
  FROM mytable AS t1 ) AS t
WHERE t.laptops >= 2 AND t.pcs <=1;

我认为窗口计数中的ORDER BY是多余的。@Giorgosbetos在这种情况下,它是多余的、更新的