SQL получает только разницу двух выбранных групп - PullRequest
1 голос
/ 11 июля 2019

Я работаю над SELECT в SQL Server, где я пытаюсь выбрать разницу в количестве двух групп.Я попытаюсь объяснить в примере:

Данные таблицы выглядят следующим образом:

+-----------+---------+------+-------+----------+-------------------------+
|   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 |
+-----------+---------+------+-------+----------+-------------------------+

мой желаемый результат, получая две строки идентификатора 12345, потому что всего есть 8 строк, которыеравны (кроме Function и Date) - есть пять Function = 1 и три Function = 2 .. поэтому я хочу 2 строки с идентификатором 12345 ... какой, не имеет значения.

То же самое дляИдентификатор 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

Я не знаю, можно ли установить LIMIT в SQLСервер по выбору?

Как

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 ]

2 голосов
/ 12 июля 2019

Если я понимаю ваш вопрос, следующий подход может помочь.Просто используйте 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
0 голосов
/ 11 июля 2019

Вы можете попробовать использовать 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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...