【问题标题】:Use tsql partition by twice in one query在一个查询中使用 tsql 分区两次
【发布时间】:2014-07-04 11:15:09
【问题描述】:

我有一个包含第 1 组、第 2 组和日期字段的表格。

如果我运行这个查询,我会得到以下结果:

SELECT 
   [group1]
  ,[group2]
  ,[date]
  ,ROW_NUMBER() over (PARTITION by [group1] order by [date]) as ord
FROM [dev_DP].[dbo].[myTable]

+--------+--------+-------------------------+-----+
| group1 | group2 |          date           | ord |
+--------+--------+-------------------------+-----+
| dan    | alarm  | 2014-05-14 12:00:00.000 |   1 |
| dan    | snooze | 2014-05-14 12:30:00.000 |   2 |
| dan    | snooze | 2014-05-14 12:50:00.000 |   3 |
| jim    | snooze | 2014-05-14 11:00:00.000 |   1 |
| jim    | snooze | 2014-05-14 12:45:00.000 |   2 |
| jim    | alarm  | 2014-05-14 13:45:00.000 |   3 |
+--------+--------+-------------------------+-----+

我想添加另一列,然后根据第 1 组和第 2 组字段向表中添加行号,但仅为第 1 组保留日期顺序。我想要的结果如下:

+--------+--------+---------------------+-----+------+
| group1 | group2 |        date         | ord | ord2 |
+--------+--------+---------------------+-----+------+
| dan    | alarm  | 2014-05-14 12:00:00 |   1 |    1 |
| dan    | snooze | 2014-05-14 12:30:00 |   2 |    1 |
| dan    | snooze | 2014-05-14 12:50:00 |   3 |    2 |
| jim    | snooze | 2014-05-14 11:00:00 |   1 |    1 |
| jim    | snooze | 2014-05-14 12:45:00 |   2 |    2 |
| jim    | alarm  | 2014-05-14 13:45:00 |   3 |    1 |
+--------+--------+---------------------+-----+------+

我该怎么做?

谢谢 丹

【问题讨论】:

  • 如果您在 SSMS 中执行查询,请将结果输出设置更改为“结果到文本”并将结果粘贴到您的代码之后。照原样,这在视觉上非常难以解析。
  • 对不起 - 应该先检查一下。谢谢。
  • 你确定第二个结果是你想要的吗?我无法在 ord2 的值中发现明显的模式。
  • 是的 - 我敢肯定 - 所以我想获得给定组 1 的“警报”序列中的第一个和“打盹”序列中的第一个。要做到这一点,必须将第 1 组分组,然后按日期订购。

标签: sql-server tsql partition


【解决方案1】:
  SELECT 
  [group1]
  ,[group2]
  ,[date]
  ,ROW_NUMBER() over (PARTITION by [group1] order by [date]) as ord1
  ,ROW_NUMBER() over (PARTITION by [group1], [group2] order by [date]) as ord2
  FROM [dev_DP].[dbo].[myTable]

【讨论】:

  • 这几乎是我想要的,但它不是按日期排序的。我需要的是按第 1 组分组,然后按日期排序,然后按第 2 组的 row_number 排序。
【解决方案2】:

如果我改变这些术语:

  SELECT 
  [group1]
  ,[group2]
  ,[date]

  ,ROW_NUMBER() over (PARTITION by [group1], [group2] order by [date]) as ord2
  ,ROW_NUMBER() over (PARTITION by [group1] order by [date]) as ord1
  FROM [dev_DP].[dbo].[myTable]

我认为这给了我想要的结果,但它没有...如果我添加另一条记录,您会看到错误。

+--------+--------+-------------------------+------+------+
| group1 | group2 |          date           | ord2 | ord1 |
+--------+--------+-------------------------+------+------+
| dan    | alarm  | 2014-05-14 12:00:00.000 |    1 |    1 |
| dan    | snooze | 2014-05-14 12:30:00.000 |    1 |    2 |
| dan    | snooze | 2014-05-14 12:50:00.000 |    2 |    3 |
| dan    | alarm  | 2014-05-14 13:00:00.000 |    2 |    4 |
| jim    | snooze | 2014-05-14 11:00:00.000 |    1 |    1 |
| jim    | snooze | 2014-05-14 12:45:00.000 |    2 |    2 |
| jim    | alarm  | 2014-05-14 13:45:00.000 |    1 |    3 |
+--------+--------+-------------------------+------+------+

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 2022-01-18
    • 1970-01-01
    • 2014-04-07
    • 2013-11-07
    • 1970-01-01
    • 2019-08-10
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多