【问题标题】:Not getting Proper rank for Rank() Partition By DateTimeRank() Partition By DateTime 没有得到正确的排名
【发布时间】:2014-10-30 09:50:12
【问题描述】:

我正在尝试使用以下查询获取RANK。一世 不知道我到底是在哪里撞到的。 谁能帮我解决这个问题?

SELECT  ID,CMNo,PLat,PLon,RDTime
    ,RANK() OVER (PARTITION BY CMNo,PLat,PLon,RDTime ORDER BY RDTime) Ranks
FROM    tblMAEH WITH(NOLOCK)
WHERE   CMNo = 69
AND     RDTime BETWEEN '2014-10-19 00:00:00.000' AND '2014-10-20 23:59:59.997'

CREATE TABLE #test (id     INT,CMNo   INT,PLat   NUMERIC(22, 6),Plon   NUMERIC(22,     6),RDTime DATETIME)

INSERT INTO #test VALUES      (8630,69,19.08491,72.83919,'21 oct 2014 14:38:13')
INSERT INTO #test VALUES      (8631,69,19.08491,72.83919,'22 oct 2014 18:38:13')
INSERT INTO #test VALUES      (8632,69,19.08491,72.83919,'20 oct 2014 14:39:13')
INSERT INTO #test VALUES      (8633,69,19.08491,72.83919,'20 oct 2014 14:38:13')


SELECT ID,CMNo,PLat,PLon,RDTime,Rank()OVER (PARTITION BY CMNo, PLat, PLon, RDTime Order                            BY RDTime) Ranks
FROM   #test WITH(NOLOCK)
WHERE  CMNo = 69
AND RDTime BETWEEN '2014-10-19 00:00:00.000' AND '2014-10-25 23:59:59.997' 

drop table #test

【问题讨论】:

  • 添加tblMAEH表的数据。
  • 实际上输出中的问题是什么。你需要什么输出?
  • 即使有你的例子,我也没有太多可以尝试理解你想要实现的目标。您能否尝试编辑问题并告诉我们您要做什么,以及 expected 输出是什么?
  • @Damien_The_Unbeliever : 只需要根据 3,4,5 列找出排名

标签: mysql sql-server-2008 sql-server-2005 sql-server-2008-r2


【解决方案1】:

由于日期时间的毫秒部分,所有标有红色标记的选定行的排名没有得到 1。

例如,对于 ID 8630,RDTime 值为 2014 年 10 月 20 日 14:38:13

RDTime 字段的实际值可能是 2014 年 10 月 20 日 14:38:13.000 对于下一行,毫秒部分是不同的。因此,所有四行的排名并不相同。

所以请去掉 RDTime 字段的毫秒部分,然后尝试重新查询相同的 SQL。

【讨论】:

  • 按照你的建议做了,面临同样的问题
  • 请看我的问题。添加了屏幕截图
【解决方案2】:

我不知道你是如何得到那个输出的。我在您的问题中运行了相同的查询,但没有得到该输出。除非你使用row_number(),否则你不会得到那个输出。检查一下。

CREATE TABLE test
  (id     INT,CMNo   INT,PLat   NUMERIC(22, 6),Plon   NUMERIC(22, 6),RDTime DATETIME)

INSERT INTO #test
VALUES      (8630,69,19.08491,72.83919,'20 oct 2014 14:38:13'),
            (8631,69,19.08491,72.83919,'20 oct 2014 14:39:13'),
            (8632,69,19.08491,72.83919,'21 oct 2014 14:38:13'),
            (8633,69,19.08491,72.83919,'22 oct 2014 14:38:13')

SELECT ID,CMNo,PLat,PLon,RDTime,
       Rank()OVER (PARTITION BY CMNo, PLat, PLon
           ORDER BY RDTime) Ranks
FROM   #test
WHERE  CMNo = 69 

ID      CMNo    PLat        PLon        RDTime                  Ranks
----    ----    ---------   ---------   ----------------------- ----- 
8630    69      19.084910   72.839190   2014-10-20 14:38:13.000 1
8631    69      19.084910   72.839190   2014-10-20 14:39:13.000 2
8632    69      19.084910   72.839190   2014-10-21 14:38:13.000 3
8633    69      19.084910   72.839190   2014-10-22 14:38:13.000 4

【讨论】:

  • 在您上面的查询中,当我更改日期时,即使所有记录的排名仍然是 1
  • 然后显示有效的例子!!。显示不同日期的示例,然后 vl 帮助你..
  • 请在我的问题中查看。添加了屏幕截图
  • @user1990383 根据查询得到的输出有什么问题是正确的。
  • 请检查日期,日期不一样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 2012-11-04
  • 2010-10-15
相关资源
最近更新 更多