SQL:证明时间模式

时间:2018-10-28 22:14:51

标签: sql

我有以下查询试图证明一种模式:

在关闭指定栏时,不能发出交易/账单:

SQL查询:

select t.transactionID, t.drinker, t.time, b.bar, b.closeTime
from transactions t 
inner join bars b 
on t.bar=b.bar  
where t.time>b.closeTime;  

问题在于,一些酒吧桌中有两家餐厅。每个都有不同的closeTime。因此,结果是: transactionID饮用者,时间,酒吧和关闭时间

   00001                     Kate             22:04.       oysterbar    24 
   00001                     Kate.            22:04.       oysterbar.   2 

问题是我不想拥有两个相同的东西。由于连接的原因,bars表中有两个关闭时间不同的oysterbar。我想打印出第一个事务ID 00001,而不是两个00001,因为第二个oysterbar具有不同的关闭时间。

2 个答案:

答案 0 :(得分:0)

我可以看到两个问题。

  1. 首先,从示例输出中,您似乎具有数据质量     问题。您的“餐厅”实际上具有唯一的键(oysterbar与     oysterbar.),但交易数据重复。
  2. 另一个     我看到的问题是查询本身。关闭时间谓词为     几乎可以肯定的是,您并没有按照您的期望做,     推断您正在尝试捕获非工作时间的交易。理想情况下,您可以将交易时间与 期         在营业时间和营业时间之间。您上面的两行很完美         示例:在晚上10:04,您有一笔交易,而这两项         一家餐厅在凌晨2点关闭,另一家则在午夜关闭。         两者都有可能在         交易。

FWIW更好的查询如下:问题2可能是:

select t.transactionID, t.drinker, t.time, b.bar, b.closeTime
from transactions t 
inner join bars b 
on t.bar=b.bar  
where t.time BETWEEN b.openTime AND b.closeTime;

答案 1 :(得分:0)

这可能有效;

select t.transactionID, t.drinker, t.time, t.bar, j.closeTime
from transactions t 
inner join (
select t1.transactionID, min(b1.closeTime) closeTime
from transactions t1 
inner join bars b1
on t1.bar=b1.bar  
where t1.time>b1.closeTime
group by t1.transactionId) j
on t.transactionID = j.transactionID;