【问题标题】:Getting n number of repeated values获取 n 个重复值
【发布时间】:2015-11-16 18:07:59
【问题描述】:

我有一张桌子。

        Id  FName  Lname  RowNo
       ----------------------------
        1   Aaron    K     0
        2   Aaron    L     1
        3   Arthur   M     2
        4   Arthur   G     3
        5   Arthur   D     4
        6   Ben      S     5
        7   Ben      E     6
        8   Cal      W     7
        9   Luke     A     8
        10  Mandy    N     9 

我已经在这张表上实现了分页,因此是行号。但我的问题是每次我想获得具有 3 个重复值的所有行时,而不是获得 3 行。例如,首先我想获取名称为 Aaron、Arthur、Ben 的所有行,即第 0 到 6 行,然后是接下来的 3 个重复值,例如 cal、luke 和 mandy 等等。这在 SQL 中可能吗????

--编辑---- 我想要 3 个可以重复任意次数的值。让我更好地解释一下。如果我在 Name 列上应用 Distinct(),我会第一次得到 Aaron,Arthur,Ben,然后第二次得到 cal,luke 和 mandy。但由于姓氏不同,我无法区分。因此,为了获得不同的值,我需要获得具有这些不同值的所有行。即第一次使用 Aaron、Arthur 和 ben 的所有行以及第二次使用 cal、luke 和 mandy 的所有行

【问题讨论】:

    标签: sql asp.net sql-server-2008 pagination


    【解决方案1】:

    如果我正确理解了您的问题,您需要 FName 重复三次的所有行,按 ID 排序。

    试试这个:

    从组中选择 FName、Lname、Id,按 FName 的 count(FName) > 3 order by Id asc;

    【讨论】:

    • 不,我想要 3 个可以重复任意次数的值。让我更好地解释一下。如果我在 Name 列上应用 Distinct(),我会第一次得到 Aaron,Arthur,Ben,然后第二次得到 cal,luke 和 mandy。但由于姓氏不同,我无法区分。因此,我只需要获得不同的值,我需要获得具有这些不同值的所有行。即第一次使用 Aaron、Arthur 和 ben 的所有行以及第二次使用 cal、luke 和 mandy 的所有行
    【解决方案2】:

    试试这个

      With CTE
        as
        (
        select row_number() over(partition by FName, order by Id) as rn,
        Id,FName,LName from YourTable
        )
    
        select * from CTE
    

    这将为您提供所需的结果。

    您只需要在 where 子句中附加您的页码。例如,如果您想要第 1 页,则查询的最后一行将更改为下面。

    select * from CTE where rn=1
    

    【讨论】:

      【解决方案3】:

      试试这个,

      declare @t table(Id int, FName varchar(10),  Lname char(1), RowNo int)
      insert into  @t (Id, FName,  Lname , RowNo) values(
      1,'Aaron'  ,'K', 0),
      (2,'Aaron','L',1),
      (3,'Arthur','M',2),
      (4,'Arthur','G',3),
      (5,'Arthur','D',4),
      (6,'Ben', 'S',5),
      (7,'Ben', 'E',6),
      (8,'Cal', 'W',7),
      (9,'Luke','A',8),
      (10,  'Mandy','N',9)
      
      
      select t.*,floor((t1.rno-1) / 3) as pge  from @t t join (select  fname,row_number() 
       over (order by fname) rno   from @t group by fname ) t1 on t.fname=t1.fname 
      

      【讨论】:

        【解决方案4】:

        我使用dense_rank() 找到了解决方案。而不是 row_Number()。完美运行。

        【讨论】:

          猜你喜欢
          • 2018-10-06
          • 2019-11-29
          • 2018-11-15
          • 1970-01-01
          • 2022-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-08
          相关资源
          最近更新 更多