【问题标题】:Monthly Report - SQL月度报告 - SQL
【发布时间】:2016-10-27 11:28:45
【问题描述】:

我有下表,如何在 SQL 中选择每个 categoryID 中每个月的最后一个日期(从列表中)?

我想结束一些事情:

类别 ID |当前 |日期

1      |    5    | 2016-09-30
1      |    3    | 2016-10-30
1      |    7    | 2016-11-30
1      |    2    | 2016-12-30

等等。随着历史的积累。

图片:

【问题讨论】:

  • 我不认为这些日期是月份的最后日期。
  • 您使用的是哪个 dbms? (在日期/时间方面,许多产品远不符合 ANSI SQL。)
  • @GordonLinoff 日期是每个星期五记录的,因此不一定是日历上每月的最后一天。例如,我制作了日期以显示我想要的最终结果。
  • @ExpressDude:DBMS 代表数据库管理系统。简而言之,您使用什么数据库?通常,你会说 MySQL、Microsoft SQL Server(T-SQL 是语言)、PostgreSQL,甚至 MongoDB...
  • UI 看起来像 SQL Management Studio,所以我在 T-SQL 上花钱

标签: c# sql tsql


【解决方案1】:

有几种方法可以做到这一点,其中之一可能是使用窗口函数行号。在 CTE(WITH)中,您可以获得日期内记录的本地顺序(使用隐蔽来摆脱这里的时间)+CategoryID 按日期时间 DESC 分区(-> 第一个是最新的)。您需要这样做,因为您不能在 WHERE 子句中使用窗口函数。然后,在主查询中,您实际上将此 CTE 用作源表,并仅获取每个分区的最新记录。

WITH LocallyOrdered AS (
  SELECT CategoryID, 
  StockCurrent,
  ROW_NUMBER() OVER (
    PARTITION BY CategoryID, CONVERT(date, RecordAdded) 
    ORDER BY RecordAdded DESC) 
  AS RowNumberOneIsLatest
  FROM OriginalTable)
SELECT CategoryID, StockCurrent FROM LocallyOrdered WHERE RowNumberOneIsLatest = 1

【讨论】:

    【解决方案2】:

    考虑到你使用的是MySQL,因为你没有提到。

    假设这是您的表,名为:'Dummy'

    cat_id  current  date     
    ------  -------  --------
         1        5  2016-09-30
         1        3  2016-10-30
         1        7  2016-11-30
         1        2  2016-12-30
         2        4  2016-10-31
         2        6  2016-10-04
    

    执行这个查询:

    select 
      o.cat_id,
      (SELECT DISTINCT 
        a.date 
      from
        Dummy a 
      where a.cat_id = o.cat_id 
      ORDER BY date DESC 
      LIMIT 1) as 'date' 
    from
      Dummy o 
    group by o.cat_id ;
    

    为您提供每个类别的最新日期:

    cat_id  date        
    ------  ------------
         1  2016-12-30  
         2  2016-10-31  
    

    编辑

    这应该专门为您的桌子工作。只需将“yourTable”替换为表的实际名称即可。

    select 
      o.CategoryID,
      o.StockCurrent
      (SELECT DISTINCT 
        a.RecordAdded 
      from
        yourTable a 
      where a.CategoryID = o.CategoryID 
      ORDER BY RecordAdded DESC 
      LIMIT 1) as 'RecordAdded' 
    from
      yourTable o 
    group by o.CategoryID ;
    

    编辑 2

    此查询返回某个类别中每个月的最新日期。希望这是你想要的。

    SELECT 
      o.CategoryID,
      o.StockCurrent,
      o.RecordAdded 
    FROM
      `yourTable` o 
    WHERE o.RecordAdded IN 
      (SELECT 
        MAX(i.RecordAdded) 
      FROM
        `yourTable` i 
      GROUP BY MONTH(i.RecordAdded)) 
    GROUP BY o.CategoryID,
      o.RecordAdded ;
    

    假设表包含以下示例数据:

    CategoryID  StockCurrent  RecordAdded  
    ----------  ------------  -------------
             1             5  2016-09-01   
             1             3  2016-09-02   
             1             7  2016-10-01   
             1             2  2016-10-02   
             2             4  2016-09-01   
             2             6  2016-09-02   
             2            66  2016-10-01   
             2            77  2016-10-02   
    

    运行此查询将返回以下结果集:

    CategoryID  StockCurrent  RecordAdded  
    ----------  ------------  -------------
             1             3  2016-09-02   
             1             2  2016-10-02   
             2             6  2016-09-02   
             2            77  2016-10-02   
    

    【讨论】:

    • 我需要每个类别每个月的最后一个“RecordAdded”日期。
    • @ExpressDude 现在检查编辑 2,如果有帮助请告诉我
    【解决方案3】:

    试试这个:

    WITH Temp As
    (
    select CategoryId, [Current], RecordAdded,
    Dense_Rank() over( partition by CategoryId order by RecordAdded desc) as CatergoryWiseRank
    from tblCategory
    )
    select CategoryId, [Current], RecordAdded from Temp where CatergoryWiseRank=1
    

    【讨论】:

    • 抱歉,它返回的结果与选择所有内容相同。
    • 您希望每个 categoryID 占一行(按 categoryID 分组)?
    • 在哪个 DBMS 之间?如果你只想要类别 id 1,也可以放 where 子句
    • 添加 where 子句很好,我可以做到。每个月工作 4 周,每个 categoryID 每月将有 4 条记录。我想要每个 categoryID 每个月的最后一条记录的列表。在 12 个月的时间里,我最终会得到每个 categoryID 的 12 条记录。
    【解决方案4】:
    SELECT  
    CASE MONTH(date_field) 
    WHEN 1 THEN 'Enero'
    WHEN 2 THEN 'Febrero'
    WHEN 3 THEN 'Marzo'
    WHEN 4 THEN 'Abril'
    WHEN 5 THEN 'Mayo'
    WHEN 6 THEN 'Junio'
    WHEN 7 THEN 'Julio'
    WHEN 8 THEN 'Agosto'
    WHEN 9 THEN 'Septiembre'
    WHEN 10 THEN 'Octubre'
    WHEN 11 THEN 'Noviembre'
    WHEN 12 THEN 'Diciembre'
    END as Mes, COUNT(date_field) as cantidad FROM nacimientos 
    WHERE YEAR(date_field)='1991'
    GROUP BY MONTH(date_field)asc
    

    结果

    【讨论】:

      猜你喜欢
      • 2015-09-16
      • 2011-06-03
      • 2012-04-18
      • 2015-05-19
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 2019-10-23
      • 2019-01-04
      相关资源
      最近更新 更多