【发布时间】:2020-11-05 00:05:06
【问题描述】:
我正在尝试按 USID 排序,然后按日期排序并重新启动 USID 上的行号,已使用。但是由于某种原因,日期的顺序不正确,所以行编号没有做我需要的。
目前这是我的代码给我的:
USID | Date | Utilized | RowNumber
123 | 1/1/19 | T | 1
123 | 1/2/19 | T | 2
123 | 1/3/19 | T | 3
123 | 1/19/19| T | 4
123 | 1/20/19| T | 5
123 | 1/21/19| T | 6
123 | 1/4/19 | F | 1
123 | 1/5/19 | F | 2
123 | 1/6/19 | F | 3
123 | 1/7/19 | F | 4
123 | 1/8/19 | F | 5
123 | 1/9/19 | F | 6
125 | 1/1/19 | T | 1
125 | 1/2/19 | T | 2
125 | 1/3/19 | T | 3
125 | 1/10/19| T | 4
125 | 1/11/19| T | 5
125 | 1/12/19| T | 6
125 | 1/4/19 | F | 1
125 | 1/5/19 | F | 2
125 | 1/6/19 | F | 3
125 | 1/7/19 | F | 4
125 | 1/8/19 | F | 5
125 | 1/9/19 | F | 6
但是我希望它看起来像:
USID | Date | Utilized | RowNumber
123 | 1/1/19 | T | 1
123 | 1/2/19 | T | 2
123 | 1/3/19 | T | 3
123 | 1/4/19 | F | 1
123 | 1/5/19 | F | 2
123 | 1/6/19 | F | 3
123 | 1/7/19 | F | 4
123 | 1/8/19 | F | 5
123 | 1/9/19 | F | 6
123 | 1/19/19| T | 1
123 | 1/20/19| T | 2
123 | 1/21/19| T | 3
125 | 1/1/19 | T | 1
125 | 1/2/19 | T | 2
125 | 1/3/19 | T | 3
125 | 1/4/19 | F | 1
125 | 1/5/19 | F | 2
125 | 1/6/19 | F | 3
125 | 1/7/19 | F | 4
125 | 1/8/19 | F | 5
125 | 1/9/19 | F | 6
125 | 1/10/19| T | 1
125 | 1/11/19| T | 2
125 | 1/12/19| T | 3
这是我目前所拥有的:
select
USID, cast(Date as datetime) as Date, Utilized,
ROW_NUMBER() OVER(PARTITION BY USID, Utilized
ORDER BY USID, cast(Date as datetime) ASC, Utilized)
from vps_time_FullyUtilized
我哪里错了?
【问题讨论】:
-
看来您想统计组值的集群,并在集群更改值时重新开始计数。
-
cast(Date as datetime)的意义何在?日期不需要铸造。它们也不使用两位数年份显示。如果您将日期存储为字符串,更糟糕的是,存储为两位数的年份,您将遇到一个重大错误。就在劳埃德和瑞银因此类 Y2K 黑客事件而崩溃的那一年 -
顺便说一句,通过存储字符串而不是日期,您实际上正在使用更多存储空间。
date类型只占用 3 个字节。修复表架构。 PS SSMS 只是一个客户端工具,而不是数据库服务器。它不影响服务器的排序方式 -
它们在源系统中被存储为日期,但为了让两个表在这个视图中运行,它们映射为 varchar。在这种情况下,我真的只需要弄清楚如何正确排序
-
你不能仅仅使用
ROW_NUMBER来解决这个问题。您需要找到具有相同 USID 和 Utilized 值的“岛屿”。这个问题的实际名称是gaps and islands。您可以使用LEAD或LAG函数在结果集中查找下一个Utilized值并检测孤岛何时结束
标签: sql-server tsql