我正在使用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'
仅在时间戳不超过一小时的情况下,选择才应注意。
答案 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 ;