SQL Server:在a中选择如何使用ID为重复值添加列

时间:2018-02-28 00:25:18

标签: sql sql-server-2012

我需要帮助来弄清楚如何在sql server中执行此操作,我一直在不知疲倦地搜索,到目前为止没有运气,我确定这不是一个重复的问题。

我们说我在选择中有这个结果:

  date value name
  16:02 429 nameIdontKnow1
  16:03 430 nameIdontKnow1
  16:04 433 nameIdontKnow1
  16:02 435 nameIdontKnow2
  16:03 430 nameIdontKnow2
  ...

我需要的是,在选择中,我需要获取相同值的ID,但我不知道名称列中会出现什么,因为选择从较大的前10位中选择组。这是一个图表,其中id将用于图表系列,我不能使用名称列,因为我不知道将在那里出现什么

  date value name           id
  16:02 429 nameIdontKnow1  1
  16:03 430 nameIdontKnow1  1
  16:04 433 nameIdontKnow1  1
  16:02 435 nameIdontKnow2  2
  16:03 430 nameIdontKnow2  2
  ...

所以我需要的是它根据名称列的不同重复值分配相同的id,但不是硬编码的" nameIdondtKnow1"在案件转换或其他事情,因为我不知道在任何给定时间将有什么价值。

例如,下次查询运行时,它可能是

  date value name           id
  16:02 429 nameIdontKnow6  1
  16:03 430 nameIdontKnow6  1
  16:02 433 nameIdontKnow8  2
  16:04 435 nameIdontKnow6  1
  16:02 430 nameIdontKnow9  3
  ...

我的选择看起来像这样

  Select CONVERT(VARCHAR(5),date,114) date, value, name, (idIdontknowhowtomake) as id 
  from tableA 
  where name in (
        select top 10 name from tableA 
        where date > dateadd(hour, -1, GETDATE()) 
        group by name order by max(value) 
   )

现在不同名称的总集合为20,而我的选择将始终只返回20个中的10个,其​​中最后一个小时中列值中的最大数字。它将在Silverlight中制作并且无法更改的图表,并且由于它将被发布,理想的是每次将新名称添加到&#34时都不需要更改查询;图池"因为它总是只选择10个可能值,所以我不能使用开关盒。

提前谢谢大家!

2 个答案:

答案 0 :(得分:1)

您正在寻找窗口函数,特别是DENSE_RANK

SELECT
   Date = Convert(varchar(5), date, 114),
   Value,
   Name,
   Id = DENSE_RANK() OVER (ORDER BY Name) 
FROM dbo.TableA 
WHERE
   Name IN (
      SELECT TOP 10 Name FROM dbo.TableA 
      WHERE Date > DateAdd(hour, -1, GetDate()) 
      GROUP BY Name
      ORDER BY Max(Value) 
   );

此外,最佳做法是使用模式名称(dbo.TableName)。尝试一致地格式化缩进和大小写。

请注意,如果前10个项目有重复项,则查询可能不会返回10个不同的Name值。在那里将会有一些微妙的回归。

答案 1 :(得分:1)

因此,计算您的前10名并为顶部的每个潜在名称带来最小值。然后使用dense_rank()根据捕获的最小值对这些行进行编号。

with m as (
    select top 10
        date, value name,
        min(value) over (partition by name) as min_per_name
    from T
    order by date -- ??
)
select *, dense_rank() over (order by min_per_name) as id
from m;

ErikE的查询根本不同。需要注意的一点是,他的查询返回了前10名的名称,然后所有具有该名称的行都会出现在最终结果中,很可能导致超过10行。它似乎也没有与结果的排名有任何关系。

您可以在此处看到不同之处:http://rextester.com/ZBHMN31712