【问题标题】:Confused by SQL query对 SQL 查询感到困惑
【发布时间】:2016-07-22 16:24:06
【问题描述】:
USE tempdb;
GO

IF OBJECT_ID('tempdb..#demo_data') IS NOT NULL
BEGIN
  DROP TABLE #demo_data;
END;

CREATE TABLE #demo_data 
(
    row_id          INT PRIMARY KEY,
    product         VARCHAR(30) NOT NULL,
    customer        VARCHAR(30) NOT NULL,
    measure         VARCHAR(30) NOT NULL,
    value           NUMERIC(6, 1)   NOT NULL,
    valid_from_day  INT NOT NULL,
    valid_to_day    INT NOT NULL
);

INSERT INTO #demo_data (
    row_id,
    product,
    customer,
    measure,
    value,
    valid_from_day,
    valid_to_day
)
SELECT 1 row_id, 'Widgets' product, 'Tesco' customer, 'Gross Sales Price' measure, 1 value, 20130101 valid_from_day, 20130401 valid_to_day UNION ALL
SELECT 2 row_id, 'Widgets' product, 'Tesco' customer, 'Gross Sales Price' measure, 1.5 value, 20130301 valid_from_day, 20131231 valid_to_day UNION ALL
SELECT 3 row_id, 'Widgets' product, 'Tesco' customer, 'Gross Sales Price' measure, 2 value, 20130401 valid_from_day, 20150101 valid_to_day UNION ALL
SELECT 4 row_id, 'Widgets' product, 'Tesco' customer, 'Distribution Cost' measure, 5 value, 20130101 valid_from_day, 20130401 valid_to_day UNION ALL
SELECT 5 row_id, 'Widgets' product, 'Tesco' customer, 'Distribution Cost' measure, 6 value, 20130301 valid_from_day, 20140401 valid_to_day UNION ALL
SELECT 6 row_id, 'Widgets' product, 'Tesco' customer, 'Distribution Cost' measure, 7 value, 20131231 valid_from_day, 20150101 valid_to_day UNION ALL
SELECT 7 row_id, 'Widgets' product, 'Asda' customer, 'Gross Sales Price' measure, 100 value, 00000000 valid_from_day, 99999999 valid_to_day UNION ALL
SELECT 8 row_id, 'Widgets' product, 'Asda' customer, 'Gross Sales Price' measure, 200 value, 20131231 valid_from_day, 20150101 valid_to_day UNION ALL
SELECT 9 row_id, 'Widgets' product, 'Asda' customer, 'Distribution Cost' measure, 2 value, 20130301 valid_from_day, 20131231 valid_to_day UNION ALL
SELECT 10 row_id, 'Widgets' product, 'Asda' customer, 'Distribution Cost' measure, 3 value, 20140401 valid_from_day, 20150101 valid_to_day;

SELECT
    row_id,
    product,
    customer,
    measure,
    value,
    valid_from_day,
    valid_to_day
FROM
    #demo_data
ORDER BY 1;

编写 SQL 以识别哪些行对具有相同的产品、客户和度量,并且日期范围重叠

——例如第 1 行和第 2 行具有相同的产品/客户/度量和重叠的日期范围。

我很困惑你如何在表中进行比较。我对使用连接有一些想法,但它是内部连接还是普通连接

【问题讨论】:

  • 这是甲骨文??看起来像 SQL Server - 你能澄清/更新吗?
  • 它的 SQL 服务器对错误的标签感到抱歉
  • 您需要做的第一件事是将这些日期存储为日期或在您的选择中处理。
  • 看起来像一个学校问题(将问题发布为 B)有点放弃了),所以我不会给出完整的答案......但提示是选择您感兴趣的领域、分组依据,然后使用(聚合上的一个位置)来确定哪些值出现多次。
  • 首先告诉我们结果中应该包含哪些行...看起来应该包括除 2 之外的所有行。

标签: sql sql-server database sql-server-2008


【解决方案1】:

您要查找的术语是self join。它的工作原理是这样的:

select yourFields
from yourTable t1 join yourTable t2 on t1.something = t2.something
and t1.somethingElse <> t2.somethingElse

【讨论】:

  • ?只涉及一张桌子,不知道你在这里建议什么。分组和拥有应该可以工作,不是吗?
【解决方案2】:

以下查询对您有用吗?这是一个内部连接,但连接到自身

select  t1.*,  t2.row_id, t2.valid_from_day, t2.valid_to_day 
from #demo_data t1
inner join #demo_data t2
on t1.product=t2.product and t1.customer = t2.customer and t1.measure = t2.measure
and (    (t2.valid_from_day > t1.valid_from_day) and (t2.valid_from_day < t1.valid_to_day)
      or (t2.valid_to_day > t1.valid_from_day) and (t2.valid_to_day < t1.valid_to_day)
    )

【讨论】:

  • 返回有效天 0-9999999。不过,这些不是真实的日期。
  • @scsimon,“返回有效日期 0-9999999”是什么意思?
  • 在您的查询中,返回 valid_from_day = 0 和 valid_to_day = 9999999 的行。问题是这些值不是以日期格式存储的。因此,这些不是真正的日期,甚至不是逻辑值。它们应该在用作“重叠时间框架”之前进行转换,例如......convert(datetime,convert(varchar(10),case when d.valid_from_day = 0 then null else d.valid_from_day end),104) valid_from_day
  • 好的,我明白你的意思了。但我想说“问题”从原始数据开始,我们可能需要先了解 valid_from_day = 0 的含义,然后才能在查询中过滤掉这些结果。
猜你喜欢
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多