sql - 带条件的 T-SQL OVER/PARTITION BY 查询

标签 sql sql-server window-functions

我正在为 SQL 查询而苦苦挣扎,虽然我看过许多类似的答案,但没有一个非常适合我的情况。我有如下数据集:

Date1       Amount 1    Index   Date2               Type Supplier
31/03/2018  410000.00   17      16/04/2018 06:27    102  A
31/03/2018  410000.00   17      16/04/2018 06:31    102  B
31/03/2018  400000.00   2       16/04/2018 06:37    102  A
31/03/2018  400000.00   2       16/04/2018 06:38    102  B
30/06/2018  0           20      04/07/2018 08:23    202  A
30/06/2018  0           20      04/07/2018 08:23    202  B
30/06/2018  412000.00   20      06/07/2018 12:46    102  A
30/06/2018  412000.00   20      06/07/2018 12:47    102  B
30/06/2018  442000.00   100     16/07/2018 06:27    102  A
30/06/2018  442000.00   100     16/07/2018 06:31    102  B

对于有多行具有相同类型的每个 Date1,我只想要索引与最大 Date2 的索引匹配的行,所以我想要这个输出:

Date1       Amount 1    Index   Date2               Type Supplier
31/03/2018  400000.00   2       16/04/2018 06:37    102  A
31/03/2018  400000.00   2       16/04/2018 06:38    102  B
30/06/2018  0           20      04/07/2018 08:23    202  A
30/06/2018  0           20      04/07/2018 08:23    202  B
30/06/2018  442000.00   100     16/07/2018 06:27    102  A
30/06/2018  442000.00   100     16/07/2018 06:31    102  B

我觉得使用某种形式的条件 MAX() OVER (PARTITION BY) 应该是可能的,但对于我来说,我不知道该怎么做。

最佳答案

使用LAST_VALUE (Transact-SQL)分析函数与子查询一起使用。

下面的工作示例是针对 Oracle 的(我更喜欢 Oracle,因为我在 SQLServer 上转换日期总是有问题),但是查询的想法是一样的,语法也是一样的:

演示:http://www.sqlfiddle.com/#!4/004ce7/19

SELECT * FROM (
   SELECT t.* ,
     last_value( "INDEX" ) OVER 
        ( partition by date1, "TYPE" order by date2
          ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) xx
   FROM table1 t
) x
WHERE xx = "INDEX"
ORDER BY date1;

|                DATE1 | AMOUNT1 | INDEX |                 DATE2 | TYPE | SUPPLIER |  XX |
|----------------------|---------|-------|-----------------------|------|----------|-----|
| 2018-03-31T00:00:00Z |  400000 |     2 | 2018-04-16 06:37:00.0 |  102 |        A |   2 |
| 2018-03-31T00:00:00Z |  400000 |     2 | 2018-04-16 06:38:00.0 |  102 |        B |   2 |
| 2018-06-30T00:00:00Z |  442000 |   100 | 2018-07-16 06:27:00.0 |  102 |        A | 100 |
| 2018-06-30T00:00:00Z |  442000 |   100 | 2018-07-16 06:31:00.0 |  102 |        B | 100 |
| 2018-06-30T00:00:00Z |       0 |    20 | 2018-07-04 08:23:00.0 |  202 |        B |  20 |
| 2018-06-30T00:00:00Z |       0 |    20 | 2018-07-04 08:23:00.0 |  202 |        A |  20 |

关于sql - 带条件的 T-SQL OVER/PARTITION BY 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52092986/

相关文章:

mysql - 如何将 like 与特定模式一起使用?

SQL - 使用 Sum 命令将同一个人的工资相乘

sql - 判断图是否有环

sql - 以 View 名称和日期作为参数的动态存储过程

过去日期和无限之前日期之间的 SQL 范围

sql - 在 Node.js sequelize 和 PostgreSQL 中使用多对多关联创建/更新

sql - 如何删除具有多个值的行并仅选择 1 行

mysql - SQL表结构困境(创建引用(?)表来辅助查询)

python - 过滤窗隔板至少有 3 个 5 分钟间隙

mysql - 如何检查一个组在一列中是否有三个连续的值?