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;  

问题是有些酒吧的桌子上有两家餐馆。每个都有不同的关闭时间。因此,结果是:transactionID饮酒者、时间、酒吧和闭门

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

问题是,我不想拥有两样相同的东西。由于连接,酒吧桌上有两个不同封闭时间的牡蛎酒吧。我想打印出第一个交易id 00001,而不是两个00001,因为第二个牡蛎酒吧的关门时间不同。

我可以看到两个问题。

  1. 首先,从您的样本输出来看,您似乎具有数据质量问题你的"餐厅"实际上有独特的钥匙(oysterbarvsoysterbar.(,但是事务数据是重复的
  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;

这可能会起作用;

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;

最新更新