【问题标题】:Trying to show dates of MIN and MAX values of each customers on DB BROWSER for SQLITE尝试在 DB BROWSER for SQLITE 上显示每个客户的 MIN 和 MAX 值的日期
【发布时间】:2020-05-03 02:37:35
【问题描述】:
+----------------------------------+
| CUST_NO,YEAR_MONTH,TOTAL_DEPOSIT |
+----------------------------------+
| 1,201912,802452                  |
| 1,201911,30                      |
| 1,201910,370071                  |
| 2,201912,33                      |
| 2,201911,0                       |
| 2,201910,89                      |
| 3,201912,2                       |
| 3,201911,926091                  |
| 3,201910,82                      |
+----------------------------------+

在这个数据表上,我试图在 SQLite 上查询 MIN 和 MAX 值的日期

输出应该是这样的

╔═════════════════════════════════╗
║ CUST_NO,DATE_OF_MIN,DATE_OF_MAX ║
╠═════════════════════════════════╣
║ 1,201911,201912                 ║
║ 2,201911,201910                 ║
║ 3,201912,201911                 ║
╚═════════════════════════════════╝

这是我到目前为止所做的;

SELECT 
CUST_NO
,YEAR_MONTH
,MAX(TOTAL DEPOSIT) AS TOTAL_DEP_MAX
FROM XSELL_DATAMART 
GROUP BY CUST_NO

所以我可以获得最大值的日期,但不知何故我需要将此日期保存为 DATE_OF_MAX 并为 MIN 重复此操作并在内部选择它们或创建两个单独的表并将它们组合起来?这就是我卡住的地方。

【问题讨论】:

  • 它们是什么:TIME_DEP 和 DEMAND_DEPOSIT,如果有超过 1 个日期具有相同的最大或最小存款怎么办?
  • 对不起,Total_Deposit 实际上是我通过简单地将两种不同的存款类型相加而创建的列,我复制粘贴了我的代码并忘记相应地编辑我的代码

标签: sql sqlite


【解决方案1】:

最简单的方法是用FIRST_VALUE()窗口函数:

SELECT DISTINCT
  CUST_NO,
  FIRST_VALUE(YEAR_MONTH) OVER (PARTITION BY CUST_NO ORDER BY TOTAL_DEPOSIT) DATE_OF_MIN,
  FIRST_VALUE(YEAR_MONTH) OVER (PARTITION BY CUST_NO ORDER BY TOTAL_DEPOSIT DESC) DATE_OF_MAX
FROM XSELL_DATAMART

请参阅demo。
结果:

| CUST_NO | DATE_OF_MIN | DATE_OF_MAX |
| ------- | ----------- | ----------- |
| 1       | 201911      | 201912      |
| 2       | 201911      | 201910      |
| 3       | 201912      | 201911      |

【讨论】:

    【解决方案2】:

    我不确定,但会试一试。

    Select mn.CUST_NO, YEAR_MONTH_MIN, YEAR_MONTH_MAX
    From
    (
    SELECT 
        d.CUST_NO
        ,d.YEAR_MONTH as YEAR_MONTH_MIN
    From XSELL_DATAMART d
    Inner join
    (
        SELECT 
             CUST_NO
            ,MIN(TOTAL_DEPOSIT) AS TOTAL_DEP_MIN
        FROM XSELL_DATAMART 
        GROUP BY CUST_NO
        ) n on d.CUST_NO = n.CUST_NO and d.TOTAL_DEPOSIT = n.TOTAL_DEP_MIN
    ) mn
    Inner join 
    (
    SELECT 
        d.CUST_NO
        ,d.YEAR_MONTH as YEAR_MONTH_MAX
    From XSELL_DATAMART d
    Inner join
    (
        SELECT 
             CUST_NO
            ,MAX(TOTAL_DEPOSIT) AS TOTAL_DEP_MAX
        FROM XSELL_DATAMART 
        GROUP BY CUST_NO
        ) n on d.CUST_NO = n.CUST_NO and d.TOTAL_DEPOSIT = n.TOTAL_DEP_MAX
    )mx on mn.CUST_NO = mx.CUST_NO
    }
    

    【讨论】:

      【解决方案3】:

      试试这个,这里是demo。

       select
            CUST_NO,
            min(YEAR_MONTH) as DATE_OF_MAX,
            max(YEAR_MONTH) as DATE_OF_MIN
        from
        (
          select
            CUST_NO,
            YEAR_MONTH,
            row_number() over (partition by CUST_NO order by TOTAL_DEPOSIT desc) as hrnk,
            row_number() over (partition by CUST_NO order by TOTAL_DEPOSIT) as lrnk
          from myTable
        ) t
        where hrnk = 1 or lrnk = 1
        group by
          CUST_NO
      

      输出:

      | CUST_NO | DATE_OF_MAX | DATE_OF_MIN |
      | ------- | ----------- | ----------- |
      | 1       | 201911      | 201912      |
      | 2       | 201910      | 201911      |
      | 3       | 201911      | 201912      |
      

      【讨论】:

      • 预期输出与您的不匹配。但我认为,我可以通过获得 MIN 和 MAX TOTAL_DEPOSIT 而不是 YEAR_MONTH 来获得我需要的东西
      • @EgeÇıkrıkçı 如果这解决了您的问题,请点击勾选标记接受它。谢谢
      • 我想我无法解释我的问题,请让我们再试一次。因为我认为你认为我正在尝试获取 YEAR_MONTH 的最小值和最大值,但我实际上是在尝试获取 TOTAL_DEPOSIT 的最小值和最大值并显示相应的 YEAR_MONTH,所以 201912 是最小值,因为 TOTAL_DEPOSIT = 2
      • @EgeÇıkrıkçı 查看更新的内容以及我如何使用row_number。我的解决方案是正确的,您也可以尝试使用您的数据。
      猜你喜欢
      • 1970-01-01
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多