【问题标题】: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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-01
          • 2016-03-06
          • 1970-01-01
          • 1970-01-01
          • 2014-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多