2013-03-18 72 views
0

我需要一些帮助为数据库查询构建SQL命令。该数据库有5列:根据多个条件选择特定数据

Date(string) 
Name(string) 
number(int) 

每个日期,名称和编号可以有多个条目。

我想为每个日期和名称组合选择一行。问题是这些有多个实例。对于每个日期和姓名组合,我想选择数字最高的那个。我希望按日期排序。例如:

date | name | number 
1/1/1  henry  500 
1/1/1  henry  2000 
1/1/1  jacob  5 
1/1/1  jacob  8 
1/2/1  henry  6 

该命令将返回:

1/1/1  henry  2000 
1/1/1  jacob  8 
1/2/1  henry  6 

我一直在与一些命令瞎搞,但我是一个漂亮的丢失。这甚至有可能吗?

+0

什么SQL味(MySQL和SQL服务器,Oracle等),您使用的:像这样(确切语法可以根据您的SQL版本而异)?你已经尝试了什么?你知道如何使用'GROUP BY'子句吗? – 2013-03-18 22:05:50

+0

SQL Server 2012.是的,我有。我想我明白你要去哪里了。我会给它一个镜头。 – 40Alpha 2013-03-18 22:07:50

+1

我发布了我的想法。如果您有其他需要查看的列,那么解决方案就不会像我的那么简单。 – 2013-03-18 22:12:33

回答

2

您可以使用ROW_NUMBER

WITH cte 
    AS (SELECT date, 
       name, 
       number, 
       rn = Row_number() 
         OVER( 
         partition BY date, name 
         ORDER BY number DESC) 
     FROM dbo.tablename) 
SELECT date, 
     name, 
     number 
FROM CTE 
WHERE rn = 1 
ORDER BY date ASC 

DEMO

ROW_NUMBER将始终选择每组一个记录。如果您希望获取具有给定名称的最高号码的所有行(如果有多个),请改为使用DENSE_RANK

+0

谢谢。但是我不确定我是否理解WITH cte ...可以在SQL Server中使用它吗? – 40Alpha 2013-03-18 22:13:19

+0

@ 40Alpha:是的,这是TSQL在MS SQL-Server中的作用。它使用[Common Table Expression](http://msdn.microsoft.com/zh-cn/library/ms175972.aspx)+ ['ROW_NUMBER'](http://msdn.microsoft.com/zh-cn/ us/library/ms186734.aspx)(它也存在于Oracle等其他rdbms中)。我已经使用CTE进行了简化,因为它们提高了可读性。 – 2013-03-18 22:16:00

+0

现在有道理哈哈!谢谢。如果解决问题,我会通知你。 – 40Alpha 2013-03-18 22:26:59

0

尝试按日期和名称分组,然后选择最大数量。

select 
    date, 
    name, 
    max(number) 
from 
    yourtable 
group by 
    date, 
    name 
order by 
    date asc 
0
SELECT date, name, MAX(number) 
FROM Table1 
GROUP BY date, name 
ORDER date, name