我需要帮助来弄清楚如何在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个可能值,所以我不能使用开关盒。
提前谢谢大家!
答案 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