我有以下查询试图证明一个模式:
交易/票据不能在指定酒吧关闭时发出:
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,因为第二个牡蛎酒吧的关门时间不同。
我可以看到两个问题。
- 首先,从您的样本输出来看,您似乎具有数据质量问题你的"餐厅"实际上有独特的钥匙(
oysterbar
vsoysterbar.
(,但是事务数据是重复的 - 另一个我看到的问题是查询本身。关闭时间谓词为几乎可以肯定的是,没有做你期望的事情,尤其是您试图捕获下班后事务的推断。理想情况下,您可以将事务时间与时期在关闭和打开时间之间。你上面的两排都很完美示例:在晚上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;