在WHERE子句中使用MAX< - 运算符

时间:2017-08-15 15:20:30

标签: sql-server

我希望在注册地址等于一个(多个)投放地址时选择表格中的条目。此地址是客户将所有订单发送到此地址的地址,因为地址已创建。 日期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个地址,公司的订单已发送到该地址。

  • 地址1 (DEL St.1|0212)上的第一个订单位于01.01.2015
    • 此地址的最后一个订单位于06.03.2015
  • 地址2 (REF Wy.1|9875)上的第一个订单位于26.02.2015
    • 此地址的最后一个订单位于16.05.2015 ...

- >我希望cID的注册地址(公司的实际地址)是实际且唯一的交付地址。

2 个答案:

答案 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.