【问题标题】:SQL Query Help: Selecting Rows That Appear A Certain Number Of TimesSQL 查询帮助:选择出现一定次数的行
【发布时间】:2010-09-11 10:09:20
【问题描述】:

我有一个带有“日期”列的表格。每个日期可能出现多次。如何仅选择出现

【问题讨论】:

    标签: sql date select


    【解决方案1】:
    SELECT * FROM [MyTable] WHERE [Date] IN
    (
        SELECT [Date] 
        FROM [MyTable] 
        GROUP By [Date] 
        HAVING COUNT(*) < @Max
    )
    

    参见@[SQLMenace] 的回复。这与此非常相似,但根据您的数据库,假设优化器不会产生影响,他的 JOIN 可能会运行得更快。

    【讨论】:

      【解决方案2】:
      select dates 
        from table t 
       group by dates having count(dates) < k ;
      

      希望它适用于 ORACLE。 高温

      【讨论】:

        【解决方案3】:

        使用 COUNT 聚合:

        SELECT Date
        FROM SomeTable
        GROUP BY Date
        HAVING COUNT(*) < @k
        

        【讨论】:

          【解决方案4】:

          例子

          DECLARE @Max int
          SELECT @Max =  5
          
          SELECT t1.* 
          FROM [MyTable] t1 
          JOIN(
              SELECT [Date] 
              FROM [MyTable] 
              GROUP By [Date] 
              HAVING COUNT(*) < @Max
          ) t2 on t1.[Date]  = t2.[Date] 
          

          【讨论】:

          • 赞成,因为连接可能比我的 IN() 子句更快
          【解决方案5】:

          对于“出现 x 次”的查询,最好使用 HAVING 子句。在您的情况下,查询可以是:

          SELECT Date FROM table GROUP BY Date HAVING COUNT(*)<k
          

          或者,您需要选择除日期以外的其他列:

          SELECT * FROM Table WHERE Date IN (
          SELECT Date FROM table GROUP BY Date HAVING COUNT(*)<k)
          

          您也可以将 IN 重写为 INNER JOIN,但这不会提高性能,因为事实上,查询优化器会在大多数 RDBMS 中为您执行此操作。在 Date 上建立索引肯定会提高此查询的性能。

          【讨论】:

            【解决方案6】:
            SELECT date, COUNT(date)
            FROM table
            GROUP BY date
            HAVING COUNT(date) < k
            

            然后再取回原始数据:

            SELECT table.*
            FROM table
            INNER JOIN (
              SELECT date, COUNT(date) 
              FROM table
              GROUP BY date
              HAVING COUNT(date) < k) dates ON table.date = dates.date
            

            【讨论】:

              【解决方案7】:

              假设您使用的是 Oracle,并且 k = 5:-

              select date_col,count(*)
              from your_table
              group by date_col
              having count(*) < 5;
              

              如果您的日期列也填写了时间,并且您想忽略它,请修改查询,使其如下所示:-

              select trunc(date_col) as date_col,count(*)
              from your_table
              group by trunc(date_col)
              having count(*) < 5;
              

              【讨论】:

                【解决方案8】:

                如果您的日期包含时间,您可能无法直接在日期字段上进行计数。您可能需要先转换为年/月/日格式,然后再计算。

                否则您的计数将被取消,因为通常很少有记录具有完全相同的时间。

                【讨论】:

                  猜你喜欢
                  • 2011-04-04
                  • 2011-05-14
                  • 2023-03-23
                  • 2014-06-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多