SQL仅获得两个选择组的区别

时间:2019-07-11 19:50:49

标签: sql sql-server select

我正在使用SQL Server上的SELECT,在这里我尝试选择两个组的数量之差。我将在一个示例中尝试解释:

表数据如下:

+-----------+---------+------+-------+----------+-------------------------+
|   Ident   |   Name  |Length| Width | Function | Date                    |
+-----------+---------+------+-------+----------+-------------------------+
|  12345    | Name1   | 2500 |  1000 |        1 | 2019-06-13 22:13:26.197 |
|  12345    | Name1   | 2500 |  1000 |        1 | 2019-06-13 22:16:21.950 |
|  12345    | Name1   | 2500 |  1000 |        2 | 2019-06-13 22:17:49.753 |
|  12345    | Name1   | 2500 |  1000 |        2 | 2019-06-13 22:18:28.807 |
|  12345    | Name1   | 2500 |  1000 |        1 | 2019-06-13 22:19:25.433 |
|  12345    | Name1   | 2500 |  1000 |        2 | 2019-06-13 22:30:41.243 |
|  12345    | Name1   | 2500 |  1000 |        1 | 2019-06-13 22:34:04.517 |
|  12345    | Name1   | 2500 |  1000 |        1 | 2019-06-13 22:38:53.967 |
|  98765    | Name2   | 2500 |  1000 |        1 | 2019-06-13 22:58:15.027 |
|  98765    | Name2   | 2500 |  1000 |        2 | 2019-06-13 23:01:09.607 |
|  98765    | Name2   | 2500 |  1000 |        1 | 2019-06-13 23:04:20.060 |
|  98765    | Name2   | 2500 |  1000 |        1 | 2019-06-13 23:07:27.970 |
|  98765    | Name2   | 2500 |  1000 |        2 | 2019-06-13 23:21:09.703 |
+-----------+---------+------+-------+----------+-------------------------+

我想要的结果,得到两行Ident 12345,因为总共有8行相等(功能和日期除外)-有五个Function = 1和三个Function = 2 ..所以我想要2行ident 12345 ...没关系。

与Ident 98765相同。我想要的结果将是1行。

一共选择了3行

- 12345,Name1,2500,1000,1,2019-06-13 22:13:26.197
- 12345,Name1,2500,1000,1,2019-06-13 22:16:21.950
- 98765,Name2,2500,1000,1,2019-06-13 23:21:09.703

我不知道是否可以通过选择在SQL Server中设置LIMIT?

SELECT * 
FROM dbo.table 
WHERE Function = 1 
  AND Date > DATEADD(HOUR, -1, GETDATE()) 
LIMIT     'get difference of group count Function=1 and Function=2'

仅在时间戳不超过一小时的情况下,选择才应注意。

2 个答案:

答案 0 :(得分:2)

如果我理解您的问题,那么下一种方法可能会有所帮助。只需使用SUM()作为窗口函数和ROW_NUMBER()

表格:

CREATE TABLE #Data (
   Ident int,   
   Name varchar(10),
   Length int,
   Width int,
   [Function] int, 
   [Date] datetime                    
)
INSERT INTO #Data 
   (Ident, Name, Length, Width, [Function], [Date])
VALUES
   (12345, 'Name1', 2500, 1000, 1, '2019-06-13T22:13:26.197'),
   (12345, 'Name1', 2500, 1000, 1, '2019-06-13T22:16:21.950'),
   (12345, 'Name1', 2500, 1000, 2, '2019-06-13T22:17:49.753'),
   (12345, 'Name1', 2500, 1000, 2, '2019-06-13T22:18:28.807'),
   (12345, 'Name1', 2500, 1000, 1, '2019-06-13T22:19:25.433'),
   (12345, 'Name1', 2500, 1000, 2, '2019-06-13T22:30:41.243'),
   (12345, 'Name1', 2500, 1000, 1, '2019-06-13T22:34:04.517'),
   (12345, 'Name1', 2500, 1000, 1, '2019-06-13T22:38:53.967'),
   (98765, 'Name2', 2500, 1000, 1, '2019-06-13T22:58:15.027'),
   (98765, 'Name2', 2500, 1000, 2, '2019-06-13T23:01:09.607'),
   (98765, 'Name2', 2500, 1000, 1, '2019-06-13T23:04:20.060'),
   (98765, 'Name2', 2500, 1000, 1, '2019-06-13T23:07:27.970'),
   (98765, 'Name2', 2500, 1000, 2, '2019-06-13T23:21:09.703')

声明:

SELECT 
   t.Ident, t.Name, t.Length, t.Width, t.[Function], t.[Date]
FROM (   
   SELECT 
      *,
      SUM(CASE 
             WHEN [Function] = 1 THEN 1 
             WHEN [Function] = 2 THEN -1 
             ELSE 0
          END) OVER (PARTITION BY Ident, Name, Length, Width) AS Cnt,
      ROW_NUMBER() OVER (PARTITION BY Ident, Name, Length, Width ORDER BY [Date]) AS Rn  
   FROM #Data
) t
WHERE t.Rn <= t.Cnt

输出:

Ident   Name    Length  Width   Function    Date
12345   Name1   2500    1000    1           13/06/2019 22:13:26
12345   Name1   2500    1000    1           13/06/2019 22:16:21
98765   Name2   2500    1000    1           13/06/2019 22:58:15

答案 1 :(得分:-1)

您可以尝试使用group by并根据每个组的功能1和功能2的计数差来限制组

  Select  t.Ident, t.Name, t.Length, 
    t.Width, t.[Function], t.[Date]
    from (   Select Ident,   Name , Length,
        ,Width, case when 
   count(function=1)>=count(function=2) 
   then 1
     else
        2
         end case
        , Date, 
     row_number() over( partition by 
      function) as rn,count(function=1)-
       count(function=2) as sum
       from table group by 
        Ident, Name ,Length,
        Width) t where t.rn <=t.sum ;