【问题标题】:Replacement for row_number() in clickhouse在 clickhouse 中替换 row_number()
【发布时间】:2019-05-14 09:47:04
【问题描述】:

clickhouse 数据库不支持 Row_number(),正在寻找替代函数。

SELECT company_name AS company,
       DOMAIN,
       city_name AS city,
       state_province_code AS state,
       country_code AS country,
       location_revenue AS revenueRange,
       location_TI_industry AS industry,
       location_employeecount_range AS employeeSize,
       topic,
       location_duns AS duns,
       rank AS intensityRank,
       dnb_status_code AS locationStatus,
       rank_delta AS intensityRankDelta,
       company_id,
       ROW_NUMBER() OVER (PARTITION BY DOMAIN) AS rowNumberFROM company_intent c
 WHERE c.rank > 0
   AND c.rank <= 10
   AND c.signal_count > 0
   AND c.topic IN ('Cloud Computing')
   AND c.country_code = 'US'
   AND c.rank IN (7, 8, 9, 10)
 GROUP BY c.location_duns,
          company_name,
          DOMAIN,
          city_name,
          state_province_code,
          country_code,
          location_revenue,
          location_TI_industry,
          location_employeecount_range,
          topic,
          rank,
          dnb_status_code,
          rank_delta,
          company_id
 ORDER BY intensityRank DESC
 LIMIT 15 SELECT COUNT (DISTINCT c.company_id) AS COUNT
  FROM company_intent c
 WHERE c.rank > 0
   AND c.rank <= 10
   AND c.signal_count > 0
   AND c.topic IN ('Cloud Computing')
   AND c.country_code = 'US'
   AND c.rank IN (7, 8, 9, 10)

执行上述查询时出现以下错误。

预期之一:SETTINGS、FORMAT、WITH、HAVING、LIMIT、FROM、PREWHERE、token、UNION ALL、逗号、WHERE、ORDER BY、INTO OUTFILE、GROUP BY

欢迎提出任何建议

【问题讨论】:

    标签: sql clickhouse yandex


    【解决方案1】:

    ClickHouse 目前不支持窗口函数。有一个 rowNumberInAllBlocks 函数可能会让您感兴趣。

    【讨论】:

      【解决方案2】:
      SELECT
          *,
          rowNumberInAllBlocks()
      FROM
          (
              -- YOUR SELECT HERE
          )
      

      https://clickhouse-docs.readthedocs.io/en/latest/functions/other_functions.html 说:

      rowNumberInAllBlocks() 返回此函数处理的所有块中的增量行号。

      【讨论】:

        【解决方案3】:

        像这样的东西(可怕的lokks,但效果很好)

        SELECT *, rn +1 -min_rn current, max_rn - min_rn + 1 last FROM (
        SELECT *, rowNumberInAllBlocks() rn FROM (
        SELECT i_device, i_time
        FROM tbl
        ORDER BY i_device, i_time
        ) t
        ) t1 LEFT JOIN (
        SELECT i_device, min(rn) min_rn, max(rn) max_rn FROM (
        SELECT *, rowNumberInAllBlocks() rn FROM (
        SELECT i_device, i_time
        FROM tbl
        ORDER BY i_device, i_time
        ) t
        ) t GROUP BY i_device
        ) t2 USING (i_device)
        

        【讨论】:

          【解决方案4】:
          SELECT *, rowNumberInAllBlocks() as row_count FROM (SELECT .....)
          

          【讨论】:

          • 感谢您的回答,但请考虑在您的回答中添加一些解释。
          猜你喜欢
          • 2018-03-11
          • 2020-09-20
          • 1970-01-01
          • 1970-01-01
          • 2021-12-31
          • 2013-09-23
          • 1970-01-01
          • 1970-01-01
          • 2022-06-13
          相关资源
          最近更新 更多