sql - T-SQL : Using OVER and PARTITION BY

标签 sql sql-server sql-server-2005 tsql

我有以下数据

 |  Item  | Value |    Date   |
 ------------------------------
 |   1    |  10   | 01.01.2010
 |   1    |  20   | 02.01.2010
 |   1    |  30   | 03.01.2010
 |   1    |  40   | 04.01.2010
 |   1    |  50   | 05.01.2010
 |   1    |  80   | 10.01.2010
 |   2    |  30   | 04.01.2010
 |   2    |  60   | 06.01.2010
 |   2    |  70   | 07.01.2010
 |   2    |  80   | 08.01.2010
 |   2    |  100  | 09.01.2010

以及以下声明

SELECT   Item, Value, MIN(Date) OVER (PARTITION BY Item) 
FROM     Data
WHERE    Value >= 50   

我得到以下结果

 |  Item  | Value |    Date   |
 ------------------------------
 |   1    |  50   | 05.01.2010
 |   1    |  80   | 05.01.2010
 |   2    |  60   | 06.01.2010
 |   2    |  70   | 06.01.2010
 |   2    |  80   | 06.01.2010
 |   2    |  100  | 06.01.2010

但我需要的是这个

 |  Item  | Value |    Date   |
 ------------------------------
 |   1    |  10   | 05.01.2010
 |   1    |  20   | 05.01.2010
 |   1    |  30   | 05.01.2010
 |   1    |  40   | 05.01.2010
 |   1    |  50   | 05.01.2010
 |   1    |  80   | 05.01.2010
 |   2    |  30   | 06.01.2010
 |   2    |  60   | 06.01.2010
 |   2    |  70   | 06.01.2010
 |   2    |  80   | 06.01.2010
 |   2    |  100  | 06.01.2010

是否有任何快速解决方案可以通过一条语句而不需要自连接来实现此目的?

谢谢:)

最佳答案

如果没有自加入,请尝试以下操作:

DECLARE @YourTable table (item int,value int, Date datetime)
INSERT @YourTable VALUES (1    ,  10   , '01/01/2010')
INSERT @YourTable VALUES (1    ,  20   , '02/01/2010')
INSERT @YourTable VALUES (1    ,  30   , '03/01/2010')
INSERT @YourTable VALUES (1    ,  40   , '04/01/2010')
INSERT @YourTable VALUES (1    ,  50   , '05/01/2010')
INSERT @YourTable VALUES (1    ,  80   , '10/01/2010')
INSERT @YourTable VALUES (2    ,  30   , '04/01/2010')
INSERT @YourTable VALUES (2    ,  60   , '06/01/2010')
INSERT @YourTable VALUES (2    ,  70   , '07/01/2010')
INSERT @YourTable VALUES (2    ,  80   , '08/01/2010')
INSERT @YourTable VALUES (2    ,  100  , '09/01/2010')


SELECT   Item, Value, MIN(CASE WHEN Value >= 50 THEN Date ELSE NULL END) OVER (PARTITION BY Item) 
FROM     @YourTable

输出:

Item        Value       
----------- ----------- -----------------------
1           10          2010-05-01 00:00:00.000
1           20          2010-05-01 00:00:00.000
1           30          2010-05-01 00:00:00.000
1           40          2010-05-01 00:00:00.000
1           50          2010-05-01 00:00:00.000
1           80          2010-05-01 00:00:00.000
2           30          2010-06-01 00:00:00.000
2           60          2010-06-01 00:00:00.000
2           70          2010-06-01 00:00:00.000
2           80          2010-06-01 00:00:00.000
2           100         2010-06-01 00:00:00.000
Warning: Null value is eliminated by an aggregate or other SET operation.

(11 row(s) affected)

关于sql - T-SQL : Using OVER and PARTITION BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2514239/

相关文章:

java - 基于几乎所有列进行查询时如何最有效地访问表?

sql - 如何通过 SQL 中的 LEFT JOIN 替换值?

mysql - 另一个 SQL 询问

python - 需要帮助通过 pyodbc 使用服务帐户修复 SQL 连接问题

java - Connection.close() 不会关闭连接,它会使其永远 hibernate ?

sql - 为什么我会导致聚集索引更新?

SQL 逻辑问题和交叉应用查询

SQL Server 2005 - 变量内容丢失

php - 通过单个操作输入多个表

asp.net - 推荐一个好的交互式语音应答系统来与.NET一起使用?