【问题标题】:How to create a sql query get the 2nd to Max result in table?如何创建一个 sql 查询在表中获取第二个到最大的结果?
【发布时间】:2022-09-28 08:08:05
【问题描述】:

我有一张雪花表,我想查看最大日期和第二个到最大日期的结果。我在下面写了一个查询,给出了最大日期的结果

SELECT MAX(FILE_DATE)  \"MAX_DATE\"
    ,UPPER(RETAIL)  \"SHOP\"
FROM PRODUCTS
GROUP BY UPPER(RETAIL)

结果是这样的

MAX_DATE   SHOP
2022-09-27 SHOP1
2022-08-01 SHOP2

我在寻找

2nd_MAX_DATE MAX_DATE   SHOP
2022-08-27   2022-09-27 SHOP1
2022-07-01   2022-08-01 SHOP2

我尝试了 where 子句 WHERE FILE_DATE < ( SELECT MAX(FILE_DATE) FROM \"PRODUCTS\" GROUP BY UPPER(RETAILER)) 的东西,但这不起作用

  • 你的桌子上有多少家不同的商店?

标签: sql snowflake-cloud-data-platform


【解决方案1】:

一种方法是使用交叉连接。

这是使用 SQL Server 语法对您的架构进行粗略更改的完整示例。

CREATE TABLE Products (
  Id INT PRIMARY KEY, 
  Retail VARCHAR(100), 
  FileDate DATETIME
);

INSERT INTO Products (Id, Retail, FileDate)
VALUES (1, 'shop 1', '2022-09-01'), 
       (2, 'shop 1', '2022-09-01'),
       (3, 'shop 1', '2022-09-01'),
       (4, 'shop 2', '2022-09-01'),
       (5, 'shop 2', '2022-09-01'),
       (6, 'shop 2', '2022-09-30'),
       (7, 'shop 3', '2022-09-01'),
       (8, 'shop 3', '2022-09-01'),
       (9, 'shop 3', '2022-09-20');

SELECT DISTINCT
    MAX(p1.FileDate) "MAX_DATE",
    UPPER(p1.Retail) "SHOP"
FROM Products p1
    CROSS JOIN Products p2
WHERE
    p1.FileDate > p2.FileDate
GROUP BY 
    p1.Retail,
    p2.Retail

输出

2022-09-30|SHOP 2
2022-09-20|SHOP 3

【讨论】:

    【解决方案2】:

    由于您想要每个商店的最新两个 file_dates,您可以使用 WINDOW 功能

    WITH CTE as(
    SELECT FILE_DATE  
        ,UPPER(RETAIL)  "SHOP"
        , ROW_NUMBER() OVER(PARTITION BY UPPER(RETAIL) ORDER BY FILE_DATE DESC) rn
    FROM PRODUCTS
    )
    SELECT "SHOP",MIN(FILE_DATE) second_date, MAX(FILE_DATE) first_date
    FROM CTE 
    WHERE rn < 3 
    GROUP BY "SHOP"
    

    【讨论】:

      【解决方案3】:
      create or replace TABLE SNOWPARK_QUICKSTART.TELCO.Products (
      ID INT,
      FileDate TIMESTAMP,
      Retail VARCHAR(16777216)
      );
      
      INSERT INTO Products (Id, Retail, FileDate)
      VALUES (1, 'shop 1', '2022-09-01'), 
         (2, 'shop 1', '2022-09-01'),
         (3, 'shop 1', '2022-09-01'),
         (4, 'shop 2', '2022-09-01'),
         (5, 'shop 2', '2022-09-01'),
         (6, 'shop 2', '2022-09-30'),
         (7, 'shop 3', '2022-09-01'),
         (8, 'shop 3', '2022-09-01'),
         (9, 'shop 3', '2022-09-20');
      
      
      SELECT RETAIL
            ,FILEDATE
            ,IFF(RANK()OVER(PARTITION BY RETAIL ORDER BY FILEDATE DESC)=2,'SECOND MAX DATE','MAX DATE') DAY_DESC  
      FROM 
          Products 
      GROUP BY 
          RETAIL,FILEDATE
      QUALIFY 
          RANK()OVER(PARTITION BY RETAIL ORDER BY FILEDATE DESC)<3 
      

      【讨论】:

        猜你喜欢
        • 2015-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-16
        • 2021-01-11
        • 1970-01-01
        • 1970-01-01
        • 2013-03-01
        相关资源
        最近更新 更多