【问题标题】:Query data within a range that are also within another range查询一个范围内同时在另一个范围内的数据
【发布时间】:2015-03-06 03:42:04
【问题描述】:

我想要的相当简单,但我想知道编写查询的最佳方式是什么。

例如,我有一个企业列表,我有一个购买日志。

我需要根据购买情况显示退货商家。

这会显示在过去 30 天内购买过且在 30 天前之前购买过的所有商家。

【问题讨论】:

  • 您介意发布示例数据和想要的结果吗?
  • 想要的结果只是企业数量。像 1000。它是退货企业购买的数量。
  • 您的 SQL Server 版本是多少?

标签: sql sql-server sql-server-2012


【解决方案1】:

使用SELF JOIN

表格日志

business_idpurchase_date ...

SELECT COUNT (DISTINCT l1.business_id)
FROM Log l1
JOIN Log l2 ON l1.business_id = l2.business_id 
     AND l1.purchase_date <  DATEADD(day, -30, GETDATE())
     AND l2.purchase_date >= DATEADD(day, -30, GETDATE()) 

SQL Fiddle

【讨论】:

  • 我看不出这行得通。当然,如果 purchase_date 必须小于和大于一个日期,它不会返回任何内容。
  • 不同的记录。
【解决方案2】:

您可以采取以下两种方法 -

intersect

select business_id
  from purchases
 where purchase_date >= dateadd(day, -30, getdate())
intersect
select business_id
  from purchases
 where purchase_date < dateadd(day, -30, getdate())

exists 子查询

select distinct business_id
  from purchases x
 where purchase_date >= dateadd(day, -30, getdate())
   and exists (select 1
          from purchases y
         where y.purchase_date < dateadd(day, -30, getdate())
           and y.business_id = x.business_id)

【讨论】:

    最近更新 更多