【问题标题】:SQL - Select One less record from totalSQL - 从总数中选择少一条记录
【发布时间】:2020-06-29 10:07:40
【问题描述】:
以下是数据,我想输出每个值少一条记录。
例如有
总A是4,所以输出应该是3A
总 B 为 1,因此输出不应有任何 B
总C是2,所以输出应该有一个C
总 D 为 1,因此输出不应有任何 D
总 F 为 3,所以输出应该有 2 F
+------+
| Data |
+------+
| A |
| A |
| A |
| A |
| B |
| C |
| C |
| D |
| E |
| F |
| F |
| F |
+------+
输出
+------+
| Data |
+------+
| A |
| A |
| A |
| C |
| F |
| F |
+------+
【问题讨论】:
标签:
sql
sql-server
tsql
greatest-n-per-group
window-functions
【解决方案1】:
使用解析函数:
WITH cte AS (
SELECT Data, COUNT(*) OVER (PARTITION BY Data) cnt,
ROW_NUMBER() OVER (PARTITION BY Data ORDER BY (SELECT NULL)) rn
FROM yourTable
)
SELECT Data
FROM cte
WHERE rn < cnt;
用简单的英语术语来说,上述方法保留行号(基于某种任意排序)小于每个Data 组中的记录总数的任何记录。这意味着每组一条记录将被排除在结果集中。
【解决方案2】:
使用row_number():
select t.data
from (select t.*, row_number() over (partition by data order by data) as seq
from table t
) t
where seq > 1;
【解决方案3】:
您可以使用row_number();如果你有一个排序列会更好(我假设id):
select data
from (select data, row_number() over(partition by data order by id) rn from mytable) t
where rn > 1
如果你没有排序栏,那么你可以order by data。