【问题标题】:Smart grouping in Sql serverSql server 中的智能分组
【发布时间】:2017-12-13 09:12:28
【问题描述】:

我需要制作某种集群,尝试使用 row_number、rank 和 dense_rank 但没有任何效果。

USER  START_DATE        ID_TO_CLUSTER  END_DATE          NEW FIELD_SESSION
262   01/10/2017 00:01  4              01/10/2017 00:03  S1
262   01/10/2017 00:02  4              01/10/2017 00:03  S1
262   01/10/2017 00:03  0              01/10/2017 00:03  NO SESSION 
262   01/10/2017 00:03  1              01/10/2017 00:03  NO SESSION 
262   01/10/2017 00:03  7              01/10/2017 00:03  NO SESSION 
262   01/10/2017 00:03  2              01/10/2017 00:07  NO SESSION 
262   01/10/2017 00:07  3              01/10/2017 00:07  NO SESSION 
262   01/10/2017 00:07  4              01/10/2017 00:11  S2
262   01/10/2017 00:07  4              01/10/2017 00:11  S2
262   01/10/2017 00:11  7              01/10/2017 00:11  NO SESSION 
262   01/10/2017 00:11  9              01/10/2017 00:11  NO SESSION 
262   01/10/2017 16:28  0              01/10/2017 16:30  NO SESSION 
262   01/10/2017 16:28  1              01/10/2017 16:28  NO SESSION 
262   01/10/2017 16:30  2              01/10/2017 16:30  NO SESSION 
262   01/10/2017 16:30  3              01/10/2017 16:30  NO SESSION 
262   01/10/2017 16:30  4              01/10/2017 16:36  S3
262   01/10/2017 16:30  4              01/10/2017 16:36  S3
262   01/10/2017 16:36  4              01/10/2017 16:36  S3

基本上,当 id_to_cluster 在后续时间重复时,我需要将 ID_TO_CLUSTER 分组到一个 Session (new_field_session) 中,以获得每个集群的最小开始日期和最大结束日期。

你能帮帮我吗?

更新:

响应 Leran 2002 的回答:建议的解决方案仅在要分组的行为 2 时有效,而在它们为 3 或更多时无效。有什么想法吗?

【问题讨论】:

  • 您能否为提供的示例数据添加预期输出?我怀疑你应该看看gaps-and-islands 标签。

标签: sql-server


【解决方案1】:

试试下面的查询

SELECT
  GroupNum,
  ID_TO_CLUSTER,
  NEW_FIELD_SESSION,
  MIN(START_DATE) MIN_START_DATE,
  MAX(END_DATE) MAX_END_DATE
FROM
  (
    SELECT
      *,
      CASE WHEN NEW_FIELD_SESSION=PrevSession THEN LAG(RowNum)OVER(ORDER BY RowNum) ELSE RowNum END GroupNum
    FROM
      (
        SELECT
          *,
          LAG(NEW_FIELD_SESSION)OVER(ORDER BY START_DATE,ID_TO_CLUSTER) PrevSession,
          LEAD(NEW_FIELD_SESSION)OVER(ORDER BY START_DATE,ID_TO_CLUSTER) NextSession,
          ROW_NUMBER()OVER(ORDER BY START_DATE,ID_TO_CLUSTER) RowNum
        FROM [Your table]
      ) q
    WHERE (PrevSession IS NULL OR NextSession IS NULL OR NEW_FIELD_SESSION<>PrevSession OR NEW_FIELD_SESSION<>NextSession)
  ) q
GROUP BY GroupNum,ID_TO_CLUSTER,NEW_FIELD_SESSION

我在 SQLServer 2014 上对其进行了测试。

SQL 小提琴 - http://sqlfiddle.com/#!6/6e983/1

【讨论】:

  • 我希望它是您所需要的并且可以正常工作。 ))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多