【问题标题】:How to group, find min and count count of grouped records如何分组,查找分组记录的最小和计数
【发布时间】:2012-04-11 19:04:14
【问题描述】:

我有一个由这些字段组成的表格:

id  |   date_from  | date_to      |   price   |  status
----------------------------------------------------------
CK1     22-12-2012   29-12-2012       800         1
CK1     22-12-2012   29-12-2012       1200        1
CK2     24-12-2012   30-12-2012       1400        0
CK2     24-12-2012   30-12-2012       1800        1
CK2     24-12-2012   30-12-2012       2200        1

如何创建按 ID、DATE_FROM、DATE_TO 对结果进行分组的 SQL 选择,并从状态 == 1 的价格中选择最低值,以及计算分组记录的数量?

所以结果是

id    | date_from   | date_to      |   price   |  count
CK1     22-12-2012    29-12-2012       800        2
CK2     24-12-2012    30-12-2012       1800       2

也许,有没有办法找出有多少记录因为状态 == 0 而没有分组?这不是很重要,我只是想知道是否有办法找出一组记录的未计数记录数。

【问题讨论】:

  • 这个问题似曾相识...stackoverflow.com/questions/9885879/…你在帮我们完成你的家庭作业吗?
  • 是也不是,我一直在玩昨天的解决方案,但如果我想计算却找不到解决方案。不想修改现有问题,如果我违反任何规则,我会在这里删除这个问题。

标签: sql tsql select group-by


【解决方案1】:

您的描述与您希望的结果不符。

这将符合您的描述,即在状态为 1 时给您最低价格,并计算组中的记录数:

select id, date_from, date_to, min(case status when 1 then price end) as price, count(*) as count
from TheTable
group by id, date_from, date_to

结果:

id    | date_from   | date_to      |   price   |  count
CK1     22-12-2012    29-12-2012       800        2
CK2     24-12-2012    30-12-2012       1800       3

这会给你你要求的结果,即过滤掉status为1的记录,得到最低的价格,过滤后得到分组中的记录数:

select id, date_from, date_to, min(price) as price, count(*) as count
from TheTable
where status = 1
group by id, date_from, date_to

结果:

id    | date_from   | date_to      |   price   |  count
CK1     22-12-2012    29-12-2012       800        2
CK2     24-12-2012    30-12-2012       1800       2

要获取状态为0的记录数,需要使用第一种方法,不过滤掉那些记录。如果状态只能为0或1,则可以简单地使用sum(status)获取状态为1的记录数,count(case status when 0 then 1 end)sum(1 - status)获取状态为0的记录数。

【讨论】:

    【解决方案2】:

    类似的东西应该可以解决问题:

    select ID, DATE_FROM, DATE_TO, MIN(price), COUNT(*) from my_table where satus = 1 group by ID, DATE_FROM, DATE_TO
    

    备注:一个ID字段可以有相同的值正常吗?

    MSDN article on "group by" 和其他devguru

    【讨论】:

      【解决方案3】:

      可能是这样的:

      测试数据

      DECLARE @tbl TABLE
      (
          id VARCHAR(100),
          date_from VARCHAR(100),
          date_to VARCHAR(100),
          price INT,
          status INT
      )
      
      INSERT INTO @tbl
      VALUES
          ('CK1','22-12-2012','29-12-2012',800,1),
          ('CK1','22-12-2012','29-12-2012',1200,1),
          ('CK2','22-12-2012','29-12-2012',1400,0),
          ('CK2','22-12-2012','29-12-2012',1800,1),
          ('CK2','22-12-2012','29-12-2012',2200,1)
      

      查询

      ;WITH CTE
      AS
      (
          SELECT
              ROW_NUMBER() OVER(PARTITION BY tbl.id ORDER BY tbl.price ASC) AS RowNbr,
              SUM(status) OVER(PARTITION BY tbl.id) AS [count],
              tbl.*
          FROM
              @tbl AS tbl
          WHERE
              status=1
      )
      SELECT
          CTE.id,
          CTE.date_from,
          CTE.date_to,
          CTE.price,
          CTE.[count]
      FROM
          CTE
      WHERE
          CTE.RowNbr=1
      

      【讨论】:

        猜你喜欢
        • 2017-06-30
        • 2023-01-25
        • 2019-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-14
        相关资源
        最近更新 更多