SQL - Бір бағана бірдей күннің басқа бағанынан үлкен болатын жолдарды таңдаңыз

Менде values ​​ деген кесте бар, ол келесідей:

id|field_id|value|date
1 |1       |2    |2013-06-01
2 |2       |5    |2013-06-01
3 |1       |3    |2013-06-02
4 |2       |9    |2013-06-02
5 |1       |6    |2013-06-03
6 |2       |4    |2013-06-03

Және басқа кесте, өрістер , ол ұқсас

id|code
1 |small_value
2 |large_value

I would like to select the rows from values where small_value is larger than large_value on the same date. So for the example above, the query should return the last two rows from since 6, (field_id = 1 == small_value) > 4 (field_id = 2 == large_value).

Дерекқор Microsoft SQL Server 2012 болып табылады.

Кез келген көмек үшін рахмет

2
Өрістер кестесінің толық деректерін жібере аласыз ба? ?
қосылды автор Vivek Sadh, көзі
өрістер әдеттегі құрылған_at және updated_at өрістерімен салыстыру үшін идентификатор болып табылады - кестелер туралы білгіңіз келген ерекше нәрсе бар ма?
қосылды автор rwb, көзі
өрістер әдеттегі құрылған_at және updated_at өрістерімен салыстыру үшін идентификатор болып табылады - кестелер туралы білгіңіз келген ерекше нәрсе бар ма?
қосылды автор rwb, көзі
@MarkBannister - әр күн үшін ең жақсы жолмен бірдей, бірақ сұрауды өзгертуге тым көп күш болмаса, екеуін де көргім келеді
қосылды автор rwb, көзі
Нәтижелерді әр сәйкес келетін күн үшін екі бөлек жол немесе әрбір күн үшін бір жол ретінде көргіңіз келе ме?
қосылды автор Mark Bannister, көзі
Нәтижелерді әр сәйкес келетін күн үшін екі бөлек жол немесе әрбір күн үшін бір жол ретінде көргіңіз келе ме?
қосылды автор Mark Bannister, көзі

9 жауаптар

Мұндай нәрсеге қалай қатысты

SELECT * 
FROM [values] v
WHERE EXISTS(
  SELECT 1
  FROM [values] vl
  WHERE vl.FIELD_ID = 2
  AND vl.date = v.date
  AND vl.value < v.value
 )
AND v.FIELD_ID = 1

SQL Fiddle DEMO

Міне, тағы бір мысал

SELECT *
FROM [values] vs INNER JOIN
    [values] vl ON vs.date = vl.date AND vs.FIELD_ID = 1 AND vl.FIELD_ID = 2 
WHERE vs.value > vl.value

SQL Fiddle DEMO

8
қосылды
Екінші мысал мінсіз. Рақмет сізге
қосылды автор rwb, көзі

Мұндай нәрсеге қалай қатысты

SELECT * 
FROM [values] v
WHERE EXISTS(
  SELECT 1
  FROM [values] vl
  WHERE vl.FIELD_ID = 2
  AND vl.date = v.date
  AND vl.value < v.value
 )
AND v.FIELD_ID = 1

SQL Fiddle DEMO

Міне, тағы бір мысал

SELECT *
FROM [values] vs INNER JOIN
    [values] vl ON vs.date = vl.date AND vs.FIELD_ID = 1 AND vl.FIELD_ID = 2 
WHERE vs.value > vl.value

SQL Fiddle DEMO

8
қосылды
Екінші мысал мінсіз. Рақмет сізге
қосылды автор rwb, көзі

Маған ұнайды ма, әлде бірдеңе жетіспейді ме? :

    declare @tmp table (
     id int,
     field_id int,
     value int,
     [date] datetime
    )

    select * from @tmp
    where [date] in (
        select distinct t.[date]
        from @tmp t
        left join (select * from @tmp) as s on s.[Date] = t.[Date]
          and s.field_id = 1
        left join (select * from @tmp) as l on l.[Date] = t.[Date]
          and l.field_id = 2
         where s.value > l.value
    )
1
қосылды

Бір жол:

select [date],
       max(case field_id when 1 then [value] end) small_value,
       max(case field_id when 2 then [value] end) large_value
from [values]
group by [date]
having max(case field_id when 1 then [value] end) > 
       max(case field_id when 2 then [value] end)

SQLFiddle мұнда .

Сонымен қатар, жазбаларды бөлек жолдар ретінде көру үшін мына әрекеттерді орындап көріңіз:

select v1.*
from [values] v1
join [values] v2 
  on v1.[date] = v2.[date] and 
     v1.field_id = 3-v2.field_id and
     case v1.field_id when 1 then v1.[value] else v2.[value] end >
     case v1.field_id when 2 then v1.[value] else v2.[value] end

SQLFiddle мұнда .

1
қосылды

Бір жол:

select [date],
       max(case field_id when 1 then [value] end) small_value,
       max(case field_id when 2 then [value] end) large_value
from [values]
group by [date]
having max(case field_id when 1 then [value] end) > 
       max(case field_id when 2 then [value] end)

SQLFiddle мұнда .

Сонымен қатар, жазбаларды бөлек жолдар ретінде көру үшін мына әрекеттерді орындап көріңіз:

select v1.*
from [values] v1
join [values] v2 
  on v1.[date] = v2.[date] and 
     v1.field_id = 3-v2.field_id and
     case v1.field_id when 1 then v1.[value] else v2.[value] end >
     case v1.field_id when 2 then v1.[value] else v2.[value] end

SQLFiddle мұнда .

1
қосылды
SELECT 
  small.[Date]
, small.ID as SmallID
, small.Value as SmallValue
, large.ID as LargeID
, large.Value as LargeValue
FROM [values] small
INNER JOIN [values] large ON small.[Date] = large.[Date] AND small.field_id =1 AND large.field_id =2
WHERE small.Value > large.Value

SQLFiddle Демо

1
қосылды
SELECT 
  small.[Date]
, small.ID as SmallID
, small.Value as SmallValue
, large.ID as LargeID
, large.Value as LargeValue
FROM [values] small
INNER JOIN [values] large ON small.[Date] = large.[Date] AND small.field_id =1 AND large.field_id =2
WHERE small.Value > large.Value

SQLFiddle Демо

1
қосылды

Бұл жасандылық еді. Мен өрістер кестесін жауаптан шығарғанымды ескеріңіз, себебі WHERE шарттарына арналған fields.code пайдалану қажет емес, бірақ оның орнына fields.id пайдалануға болады. Бұл мәндер кестесінде field_id сияқты бірдей.

SELECT V.id, V.field_id, V.value, V.date
FROM [values] AS V 
  INNER JOIN [values] AS V1 
    ON V.date = V1.date
WHERE (((V.field_id)=1) AND ((V.value)>[V1].[value]) AND ((V1.field_id)=2)) 
   OR (((V.field_id)=2) AND ((V.value)<[V1].[value]) AND ((V1.field_id)=1))
ORDER BY V.id;

Немесе бір жолда барлық ақпарат қажет болса:

SELECT V.id, V.field_id, V.value, V1.id, V1.field_id, V1.value, V.date
FROM [values] AS V INNER JOIN [values] AS V1 ON V.date = V1.date
WHERE (((V.field_id)=1) AND ((V.value)>[V1].[value]) AND ((V1.field_id)=2))
ORDER BY V.id;
0
қосылды

Бұл жасандылық еді. Мен өрістер кестесін жауаптан шығарғанымды ескеріңіз, себебі WHERE шарттарына арналған fields.code пайдалану қажет емес, бірақ оның орнына fields.id пайдалануға болады. Бұл мәндер кестесінде field_id сияқты бірдей.

SELECT V.id, V.field_id, V.value, V.date
FROM [values] AS V 
  INNER JOIN [values] AS V1 
    ON V.date = V1.date
WHERE (((V.field_id)=1) AND ((V.value)>[V1].[value]) AND ((V1.field_id)=2)) 
   OR (((V.field_id)=2) AND ((V.value)<[V1].[value]) AND ((V1.field_id)=1))
ORDER BY V.id;

Немесе бір жолда барлық ақпарат қажет болса:

SELECT V.id, V.field_id, V.value, V1.id, V1.field_id, V1.value, V.date
FROM [values] AS V INNER JOIN [values] AS V1 ON V.date = V1.date
WHERE (((V.field_id)=1) AND ((V.value)>[V1].[value]) AND ((V1.field_id)=2))
ORDER BY V.id;
0
қосылды