我希望在注册地址等于一个(多个)投放地址时选择表格中的条目。此地址是客户将所有订单发送到此地址的地址,因为地址已创建。 日期1 =第一个订单到特定地址的日期,日期2 =最后/最新订单到特定地址。让iot更容易理解......我有这个(表1):
任务:
|cID ||company|Street |Code|del |Street2 |Cod2|Date 1 |Date 2 |
+------------------------------------------------------------------------+
|1 ||Ex1 |ABC Rd.1|4025|Ex1 |DEL St.1|0212|01.01.2015|06.03.2015|
|1 ||Ex1 |ABC Rd.1|4025|Ex1 |REF Wy.1|9875|26.02.2015|16.05.2015|
|1 ||Ex1 |ABC Rd.1|4025|Ex1 |ABC Rd.1|4025|13.06.2015|08.08.2015|
|2 ||Ex2 |HIO Wy.1|9999|Ex2 |DEL St.1|0212|13.03.2015|09.07.2015|
|2 ||Ex2 |HIO Wy.1|9999|Ex2 |REG St.1|6754|21.02.2015|16.05.2015|
|2 ||Ex2 |HIO Wy.1|9999|Ex2 |BLA Rd.5|0897|01.03.2015|06.12.2015|
|2 ||Ex2 |HIO Wy.1|9999|Ex2 |HIO Wy.1|9999|09.10.2015|26.11.2015|
|3 ||Ex3 |REG St.1|1114|Ex3 |DEL St.9|0212|13.01.2015|09.02.2015|
|3 ||Ex3 |REG St.1|1114|Ex3 |REG St.1|6754|21.03.2015|16.09.2015|
|3 ||Ex3 |REG St.1|1114|Ex3 |BLA Rd.5|0897|08.06.2015|06.08.2015|
|4 ||Ex4 |FAR RD.9|4567|Ex4 |DDR Wy.2|0897|01.03.2015|06.12.2015|
|4 ||Ex4 |FAR RD.9|4567|Ex4 |FAR RD.9|4567|09.10.2015|26.12.2015|
预期结果
|cID ||company|Street |Code|del |Street |Code|Date 1 |Date 2 |
+------------------------------------------------------------------------+
|1 ||Ex1 |ABC Rd.1|4025|Ex1 |ABC Rd.1|4025|13.06.2015|08.08.2015|
分别为cID = 1
这是我到目前为止所尝试的内容,但它不起作用....
SELECT cID
FROM Table1
WHERE company= del
AND Street = Street2
AND Code = Cod2
AND (SELECT MAX (Date 1) > (=! MAX(Date2) FROM Table1 Group by CID)
编辑(使其更易于理解):
e.g。名为Ex1(cID 1)的公司现在位于ABC Rd.1|4025
(实际地址 - 之前的地址未知),并且在系统中有3个地址,公司的订单已发送到该地址。
(DEL St.1|0212)
上的第一个订单位于01.01.2015
,
06.03.2015
。 (REF Wy.1|9875)
上的第一个订单位于26.02.2015
16.05.2015
... - >我希望cID的注册地址(公司的实际地址)是实际且唯一的交付地址。
答案 0 :(得分:1)
尝试使用行号来获取最新日期。
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER ( PARTITION BY Street, Code, company
ORDER BY Date1 DESC) as rn
FROM Table1
WHERE Street = Street2
AND Code = Cod2
AND company = del
) T
WHERE T.rn = 1
答案 1 :(得分:0)
这应该有效:
SELECT cID
FROM Table1
WHERE Street = Street2
AND Code = Cod2
AND Date1 > (
SELECT MAX(Date2)
FROM Table1 as delivery
WHERE Table1.cID = delivery.cID
AND (delivery.Street2 <> Street OR delivery.Cod2 <> Code)
)
子查询本身必须是正确的SELECT-FROM-WHERE查询,并且必须使用变量来消除外表和内表之间的歧义。内部查询选择对同一公司进行的所有交货但不包括当前交货,并选择最近的最大日期。然后将其与当前交货地址的最早日期进行比较。
请注意,数据不是第二范式。根据用例,将表格拆分为公司表和交付表格,这可能是值得的。
在我这边,它按预期返回1.