【问题标题】:How can I get the StartDate and endDate from a table in SQL?如何从 SQL 中的表中获取 StartDate 和 endDate?
【发布时间】:2021-03-16 07:28:04
【问题描述】:

我有这张桌子。我想通过 startdate 和 enddate 查看结果。输出底部图像。我想要那种格式的输出:

CREATE TABLE [dbo].[PayerMode](
    [Location] [int] NOT NULL,
    [Customer] INT NOT NULL,
    [Date] DATE NOT NULL,
    [PayMode] Varchar(50) NOT NULL
)
GO

INSERT INTO PayerMode VALUES (100, 45454, '3/20/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45454, '3/21/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45454, '3/22/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45454, '3/23/2014','Cash');
INSERT INTO PayerMode VALUES (100, 45454, '3/24/2014','Cash');
INSERT INTO PayerMode VALUES (100, 45454, '3/25/2014','Credit');
INSERT INTO PayerMode VALUES (100, 45454, '3/26/2014','Credit');
INSERT INTO PayerMode VALUES (100, 45454, '3/27/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45454, '3/28/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45454, '3/29/2014','Cash');
INSERT INTO PayerMode VALUES (100, 45454, '3/30/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45454, '3/31/2014','Credit');
INSERT INTO PayerMode VALUES (100, 45454, '4/1/2014','Credit');
INSERT INTO PayerMode VALUES (100, 45678, '3/20/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '3/21/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '3/22/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '3/23/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '3/24/2014','Cash');
INSERT INTO PayerMode VALUES (100, 45678, '3/25/2014','Credit');
INSERT INTO PayerMode VALUES (100, 45678, '3/26/2014','Credit');
INSERT INTO PayerMode VALUES (100, 45678, '3/27/2014','Credit');
INSERT INTO PayerMode VALUES (100, 45678, '3/28/2014','Cash');
INSERT INTO PayerMode VALUES (100, 45678, '3/29/2014','Cash');
INSERT INTO PayerMode VALUES (100, 45678, '3/30/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '3/31/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '4/1/2014','Credit');

现在,我发现我的数据集中有一个缺口。我怎样才能达到相同的结果。当存在间隙时,上述查询不起作用。这是我的新数据集,我希望使用 StartDate 和 EndDate 获得相同的结果。

CREATE TABLE [dbo].[PayerMode](
    [Location] [int] NOT NULL,
    [Customer] INT NOT NULL,
    [Date] DATE NOT NULL,
    [PayMode] Varchar(50) NOT NULL
)
GO

INSERT INTO PayerMode VALUES (100, 45454, '3/20/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45454, '3/21/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45454, '3/22/2014','Insurance');

INSERT INTO PayerMode VALUES (100, 45454, '3/25/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45454, '3/26/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45454, '3/27/2014','Insurance');

INSERT INTO PayerMode VALUES (100, 45454, '3/29/2014','Cash');
INSERT INTO PayerMode VALUES (100, 45454, '3/30/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45454, '3/31/2014','Credit');
INSERT INTO PayerMode VALUES (100, 45454, '4/1/2014','Credit');
INSERT INTO PayerMode VALUES (100, 45678, '3/20/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '3/21/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '3/22/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '3/23/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '3/24/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '3/27/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '3/28/2014','Insurance');
INSERT INTO PayerMode VALUES (100, 45678, '3/31/2014','Credit');
INSERT INTO PayerMode VALUES (100, 45678, '4/1/2014','Credit');

我想要这样的结果。

Location customer StartDate enddate     paymode
100      45454    3/20/2014  3/22/2014  Insurance
100      45454    3/25/2014  3/27/2014  Insurance
100      45454    3/29/2014  3/29/2014  Cash  

【问题讨论】:

  • 请将您的示例数据添加为我们可以轻松用于测试的插入/选择语句。
  • 我给了你一个样本数据集。我添加了一张图片。它不允许我添加示例表。你想要插入语句吗?我想要每个客户的每个支付类型的 startDate 和 enddate。这是一个带有日期的表格序列。我只想要按支付模式为每个范围的最小和最大日期。
  • 您想要插入语句 很好,或者您希望我们输入您的所有数据以提供解决方案? ;)

标签: sql sql-server tsql


【解决方案1】:

这是一种孤岛问题。这个版本可能最简单地使用行号的差异来解决:

select location, customer, paymode, min(date), max(date)
from (select pm.*,
             row_number() over (partition by location, customer order by date) as seqnum,
             row_number() over (partition by location, customer, paymode order by date) as seqnum_2
      from payermode pm
     ) pm
group by (seqnum - seqnum_2), location, customer, paymode
order by location, customer, min(date);

Here 是一个 dbfiddle。

为什么这行得通有点难以解释。但是如果您查看子查询的结果,您会发现行号的差异如何识别具有相同值的相邻行。

编辑:

如果要合并连续的日期,问题就更简单了:

select location, customer, paymode, min(date), max(date)
from (select pm.*,
             row_number() over (partition by location, customer, paymode order by date) as seqnum
      from payermode pm
     ) pm
group by dateadd(day, -seqnum, date), location, customer, paymode
order by location, customer, min(date);

Here 是这个版本的数据库小提琴。

【讨论】:

  • 嗨,我测试了它,但我发现日期有差距。这是我的新数据集。
  • 你能看看我的新数据集吗?我的日期有空档。因此上述查询不起作用。它正在计算最小和最大日期。
  • 实际简化了查询。我也为那个版本添加了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多