当前位置: 首页 > 面试题库 >

在T-SQL中按日期范围分组

柴浩大
2023-03-14
问题内容

我正在尝试对此表进行查询:

Id       startdate     enddate       amount
1        2013-01-01   2013-01-31      0.00
2        2013-02-01   2013-02-28      0.00
3        2013-03-01   2013-03-31      245
4        2013-04-01   2013-04-30      529
5        2013-05-01   2013-05-31      0.00
6        2013-06-01   2013-06-30      383
7        2013-07-01   2013-07-31      0.00
8        2013-08-01   2013-08-31      0.00

我想获得输出:

2013-01-01          2013-02-28          0
2013-03-01          2013-06-30          1157
2013-07-01          2013-08-31           0

我想得到那个结果,所以我会知道什么时候开始赚钱,什么时候停止钱。我还对开始花钱之前的月份数(这解释了第一行)以及停止钱的月份数(这解释了为什么我也对2013年7月至2013年8月的第三行感兴趣)感兴趣。
)。

我知道我可以在日期上使用min和max,在金额上使用sum,但是我不知道如何以这种方式划分记录。
谢谢!


问题答案:

这是一个主意(和它有关):

;WITH MoneyComingIn AS
(
    SELECT MIN(startdate) AS startdate, MAX(enddate) AS enddate, 
        SUM(amount) AS amount
    FROM myTable
    WHERE amount > 0
)
SELECT MIN(startdate) AS startdate, MAX(enddate) AS enddate, 
    SUM(amount) AS amount
FROM myTable
WHERE enddate < (SELECT startdate FROM MoneyComingIn)
UNION ALL
SELECT startdate, enddate, amount
FROM MoneyComingIn
UNION ALL
SELECT MIN(startdate) AS startdate, MAX(enddate) AS enddate, 
    SUM(amount) AS amount
FROM myTable
WHERE startdate > (SELECT enddate FROM MoneyComingIn)

第二秒,不使用UNION(fiddle):

SELECT MIN(startdate), MAX(enddate), SUM(amount)
FROM
(
    SELECT startdate, enddate, amount,
    CASE 
        WHEN EXISTS(SELECT 1 
                    FROM myTable b 
                    WHERE b.id>=a.id AND b.amount > 0) THEN
            CASE WHEN EXISTS(SELECT 1 
                             FROM myTable b 
                             WHERE b.id<=a.id AND b.amount > 0) 
                 THEN 2 
                 ELSE 1 
            END
        ELSE 3
    END AS partition_no
    FROM myTable a
) x
GROUP BY partition_no

尽管我认为如所写,但它假定Id是有序的。您可以用代替它ROW_NUMBER() OVER(ORDER BY startdate)



 类似资料:
  • 感谢所有人!

  • 问题内容: 我希望得到一些帮助,以帮助我编写一些自己编写的SQL语句。 我有一张数据表: 我需要获得以下信息: 换句话说,按日期划分日期范围。在SQL中甚至可能吗? 我的数据库是Oracle 11G R2,由于某些情况,我担心不能使用PL / SQL。 问题答案: 可以在SQL中执行此操作。有两个技巧。首先是生成一系列数字,您可以使用进行CTE处理。 第二个是将正确的逻辑放在一起以扩展日期,同时保

  • 问题内容: 我在MySQL中有一张表,该表显示了我每天记录的小时数。我正在尝试建立一个视图,该视图将允许我按块/天范围快速将数据分组。最简单的情况是每月一次,这并不难。我可以将日期选择为“%y-%m”,然后按该列分组。 前任: 如果我按月分组,那很好。但是我的问题是,我需要从每月的13号到下个月的12号进行分组(例如:7月13日至8月12日,8月13日至9月12日,等等)。 有没有一种简单的方法可

  • 问题内容: 我有一个表,例如此数据 我想有一个查询,将日期分开,所以我有像这样一年中分开的金额: 2013年有25个月是因为2013年有1个月,而2014年有75个月是因为有3个月 有没有办法在T-SQL中做到这一点? 提前谢谢! 问题答案: 使用表格创建日历表格,然后将其加入表格以将日期范围划分为所需的任何部分。 如果按年份除以金额,然后除以月份,您可以: 这是SQL FIDDLE DEMO。

  • 问题内容: 我有一个表,其中每一行都有开始和结束日期时间。这些可以是短跨度或长跨度。 我想查询具有两个开始和停止日期时间的所有行的交集的总持续时间。 如何在MySQL中做到这一点? 还是必须选择与查询开始和结束时间相交的行,然后计算每行的实际重叠并将其累加到客户端? 举个例子,使用毫秒使它更清晰: 一些行: 我们想知道这些行在1030和1100之间的总时间。 让我们计算每行的重叠: 因此,本例中的

  • 问题内容: 根据下表 输入变量将是开始日期和结束日期。例如 如何生成以下输出? 问题答案: 您要查找的内容通常称为交叉表查询。如果您要问的是如何在给定 静态 列列表的情况下构建交叉表查询,则可以执行以下操作: 同样,您可以使用Broken Link建议的PIVOT功能。但是,以上解决方案和PIVOT功能都依赖于 静态 列声明。如果您想要的是动态列列表(又称动态交叉表),那么您将超出T-SQL最初设