2013-03-18 71 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